AngularJS:URLのクエリパラメータをクリアする方法は?


135

私のAngularJSアプリケーションは、ユーザーのLinkedInプロファイルにアクセスできる必要があります。そのためには、コールバックのredirect_uriパラメーターを含むLinkedIn URLにユーザーをリダイレクトする必要があります。これにより、LinkedInはユーザーをWebアプリケーションにリダイレクトし直し、URLに「コード」クエリパラメーターを含めます。これは従来のOauth 2.0フローです。

LinkedInがユーザーを次のURLにリダイレクトすることを除いて、すべてがうまく機能します。

http://localhost:8080/?code=XXX&state=YYY#/users/123/providers/LinkedIn/social-sites

?code=XXX&state=YYYきれいにするためにURL から削除したいと思います。ユーザーは、LinkedInリダイレクトから受け取ったクエリパラメーターを表示する必要はありません。

を試しました$location.absUrl($location.path() + $location.hash()).replace()が、クエリパラメータがURLに保持されています。

また、を使用して、 "code"などのクエリパラメータを抽出できません($location.search()).code。持ってるみたい?上記のURLの#の前がAngularをだます。

回答:


151

私が使う

$location.search('key', null)

これは私のキーを削除するだけでなく、URLの可視性からも削除するためです。


2
これにより、クロムで戻るボタンループが発生します。これは、戻るボタンの場合と同様に//example.com?key=valueに戻りますが、// example.comに角度順方向に進みます。提案?
jaybro 2015

2
これはコードの問題のように思えます。Angularは、あなたが追加したメソッドの王がいない限り、何も転送すべきではありません。また、.replace()を追加すると、現在の履歴エントリが置き換えられます。
ジュリアス

viewModelHelper.navigateTo( 'foo /'); クエリ文字列をfoo urlに永続化していたので、window.location.href = 'foo /'を使用して修正しました。代わりに。
jaybro 2015

2
ウィンドウを使用せず、代わりにAngularの$ windowを使用してください。単体テストの方が簡単になります。詳細:docs.angularjs.org/api/ng/service/$window
Julius

このanwersは、特定のパラメーターを削除する場合に最適です。
Dexxo

107

AngularJSフォーラムから回答を得ました。詳細については、このスレッドを参照してください


リンクはGoogleグループスレッドへのリンクであり、読みづらく、明確な答えが得られません。URLパラメータを削除するには

$location.url($location.path());

$ location.pathの代わりに$ location.url()にパスを置くつもりだったと思います。上記のように両方をマージしようとしてもうまくいきません。
mbdev 2014年

1
私にとっても機能しません。どちらの関数もクエリパラメータをそのままにします。
Pablo Ezequiel Leone

確かに役立つ答え。私のシナリオでは、最初に$ location.path( '/ reportmaint')。search({<myparams>})をトリガーしたたびに、以前のクエリパラメーターを削除しませんでした。
bob.mazzo 2014年

これにより、クロムで戻るボタンループが発生します。これは、戻るボタンの場合と同様に//example.com?key=valueに戻りますが、// example.comに角度順方向に進みます。提案?
jaybro 2015

+1The link is to a Google Groups thread, which is difficult to read and doesn't provide a clear answer
Vlad

70

すべてのクエリパラメータを削除するには、次の操作を行います。

$location.search({});

削除するにはONE、特定のクエリパラメータを実行します。

$location.search('myQueryParam', null);

2
Angular 1.5でも動作します。
Manish M Demblani

1
私のようにundefined使用することを避けてnullいる場合に備えて、でも動作します。
HankScorpio 2017年

私が気に入らないのは、ブラウザーの戻るボタンで戻ると、前の検索ページで直前に行った検索クエリが失われることです。
ジノ

@Gino回避策として、このリセットの前にブラウザの履歴にレコードを追加できます。stackoverflow.com/q/10541388/586051
Rahul Desai

@RahulDesai私はng-routeを使用していますが、自動的に実行するのは難しい
Gino

29

アイテムをクリアするには、アイテムを削除して$$ composeを呼び出します

    if ($location.$$search.yourKey) {
        delete $location.$$search.yourKey;
        $location.$$compose();
    }

angularjsソースから派生:https : //github.com/angular/angular.js/blob/c77b2bcca36cf199478b8fb651972a1f650f646b/src/ng/location.js#L419-L443


2
鮮やかさ!魅力のように働いた。
paulcpederson 2014年

これは私にとってはうまくいきましたが、searchメソッドを作成したときにAngularの人たちが考えていたように思われるため、Juliusのソリューションの方が正しいと思います。docs.angularjs.org/api/ng/service/$location#search
zmilojko

1
おかげで、これはかなりうまくいきました...興味深いことに、IE8はそのURLを設定/構成してから、それをロードするのが好きです。これが適切なルーティングが好まれる理由であり、私たち全員が悪い人である理由でもあると私は確信しています。:P
ロマヌス

27

次のコマンドを使用して、特定のクエリパラメータを削除できます。

delete $location.$$search.nameOfParameter;

または、searchを空のオブジェクトに設定して、すべてのクエリパラメータをクリアすることもできます。

$location.$$search = {};

2
理由はわかりませんが、このソリューションはページを切り替えるときにうまく機能しません($location.$$search = {}実行された場合でも、パラメーターは再表示されます)。@basaratソリューションはうまく機能しています。
Mik378 2014年

1
私にとってはうまくいきました-多分あなたがパラメータを削除してパスを変更しているシーケンスをチェックしますか?
demaniak 14

1
これは機能する可能性がありますが、変更してはならないプライベート変数にアクセスします。別の解決策については@Juliusの回答を参照してください
Ben Taliadoros

26

執筆時点では、@ Boshで前述したように、設定してウィンドウのビジュアルURLに反映できるようにするhtml5mode必要があります。true$location.search()

詳細については、https://github.com/angular/angular.js/issues/1521を参照してください

しかし場合は html5mode あるtrueあなたが簡単にURLのクエリ文字列をクリアすることができます。

$location.search('');

または

$location.search({});

これにより、ウィンドウのビジュアルURLも変更されます。

(AngularJSバージョン1.3.0-rc.1でテスト済みhtml5Mode(true)。)


12

html5mode=のときに機能させる必要がありfalseますか?

他の回答のすべてが角度の場合にのみ動作しhtml5modeていますtrue。あなたはの外で作業している場合html5mode、その後に、$locationあなたのハッシュで生活することを「偽」の場所にのみ言及-そのためには$location.search/編集を見ることができない/実際のページの検索のparamsを修正。

角度読み込みの前にページのHTMLに挿入される回避策は次のとおりです。

<script>
  if (window.location.search.match("code=")){
    var newHash = "/after-auth" + window.location.search;
    if (window.history.replaceState){
      window.history.replaceState( {}, "", window.location.toString().replace(window.location.search, ""));
    }
    window.location.hash = newHash;
  }
</script>

2
html5Modeをtrueに設定しないようにしたもう1つの方法は、クエリ文字列を作成して、?の直前にが含まれるようにすることです。。そう持っている myapp/#?client=clientName 代わりに myapp/?client=clientName
天使ガオ


4

別のURLに移動してクエリパラメータをクリアする場合は、次のコマンドを使用します。

$location.path('/my/path').search({});

1

ルートパラメータを使用している場合は、$ routeParamsをクリアするだけです

$routeParams= null;

1
これは、ローカル変数$routeParamsをに設定するだけnullです。実際には、アドレスバーのURLパラメータにはまったく影響しません。
エリックF.

1

場所のハッシュをnullに設定するのはどうですか

$location.hash(null);

0

パラメータをすぐに処理して次のページに移動する場合は、新しい場所の最後に疑問符を付けることができます。

たとえば、$ location.path( '/ nextPage');を実行した場合、

代わりにこれを行うことができます:$ location.path( '/ nextPage?');


0

上記の回答を試しましたが、うまく動作しませんでした。私のために働いた唯一のコードは$window.location.search = ''



0

受け入れられた答えは私にとってはうまくいきましたが、私は戻るボタンの問題を修正するためにもう少し深く掘る必要がありました。

私が気付いたのは、を使用してページにリンクし、を使用し<a ui-sref="page({x: 1})">てクエリ文字列を削除$location.search('x', null)した場合、ブラウザの履歴に余分なエントリが表示されないため、[戻る]ボタンを押すと最初の場所に戻ります。Angularがこの履歴エントリを自動的に削除するとは思わないので、これは間違っているように感じますが、これは実際には、特定のユースケースで望ましい動作です。

問題は、私が使用してページにリンクしている場合ということである<a href="https://stackoverflow.com/page/?x=1">代わりに、私は、同じようにクエリ文字列を削除しません、私は戻るボタンをクリックする必要がありますので、私のブラウザの履歴内の余分なエントリを取得二度、私が始めた場所に戻って取得します。これは一貫性のない動作ですが、実際にはこれはより正しいようです。

href使用してリンクの問題を簡単に修正できます$location.search('x', null).replace()が、ui-srefリンクを介してページにアクセスするとページが壊れるので、これは良くありません。

たくさんいじり回した後、これは私が思いついた修正です:

私のアプリのrun機能でこれを追加しました:

$rootScope.$on('$locationChangeSuccess', function () {
    $rootScope.locationPath = $location.path();
});

次に、このコードを使用してクエリ文字列パラメーターを削除します。

$location.search('x', null);

if ($location.path() === $rootScope.locationPath) {
    $location.replace();
}

0

以下のために角度> 2、あなたは明確にしたいすべてのparamsにはnullを渡すことができます

this.router.navigate(['/yourRoute'], {queryParams:{params1: null, param2: null}})
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.