6

私はほぼ 1 年間、大規模な Angular アプリに取り組んできました。

これは、params を使用した 2 つのルートです (簡潔にするために短縮されています)。

/a/:id
/a/:id/b

ユーザーが/a/1にいて、クエリ文字列が変更されたとします。たとえば、次のようになります。

/#/a/1?foo=123&bar=456

クエリ文字列を維持しながら、ユーザーを 2 番目のルートに誘導するリンクをページに表示したい/a/1/bので、最終結果は次の場所にリダイレクトされます。

/#/a/1/b?foo=123&bar=456

Angular 1.2 と新しい ngRoute モジュールを使用しています。

この動作を実現する最善の方法は何ですか?


編集: 私は今、私にはひどいと思われる実用的な解決策を持っていることに言及する必要があります. リンクは、ng-click本質的に次のハンドラーにバインドされます。

$scope.navigateToBClick = function() {
  var path = $location.path() + '/b',
    search = $location.search();
  $location.url(path + '?' + $.param(search));
};
4

6 に答える 6

1

質問を正しく理解できれば、$locationChangeStart $rootScope イベントで解決できます。これは実行フェーズで行われます。基本的な考え方は次のとおりです: 場所を変更するたびに、URL にクエリ文字列があるかどうかを確認します (URL に「?」を検索し、クエリ文字列がある場合は、それを新しい URL に追加します。

    angular.module('your_module').run(function ($rootScope) {
      $rootScope.$on('$locationChangeStart', function (event, newUrl, oldUrl) {

      // If we have queryString on currentURL , then we will add it to the next url
        if(oldUrl.indexOf('?') >= 0) {
         // this can be optimized if we want to check first for queryString in the new url,
         // then append only new params, but that's additional feature.
        newUrl += '?' + oldUrl.split('?')[1];
      }
   });

HTML では$location.path('a/1/b')を呼び出すだけで、url パラメータ (クエリ文字列) が自動的に追加されます。

于 2014-02-12T22:50:16.167 に答える
0

//コントローラ

$scope.menu = {path:"admin", name: "Administration"};
var queryString = $location.$$url.split("?")[1];
if (queryString) {
    $scope.queryString = "?" + queryString;
}

//意見

<a ng-href="#/{{menu.path}}{{queryString}}">{{menu.name}}</a>
于 2014-10-23T06:33:55.830 に答える
0

これまでに見つけた別の解決策は、すべての変更を追跡し、検索の変更ごとにスコープ変数に$location.search()保存することです。$window.location.search

次に、このスコープ変数をテンプレート内のすべてのアンカーに追加します。

<a ng-href="/projects/{{ projectId }}{{ queryString }}">
    Title
</a>

この場合、両方のルートが routeParams クエリ文字列からスコープ変数を読み取り、それらの変数を使用して、それに応じてアンカー属性の$scope.$watch変更を反映します。$location.searchhref

于 2014-02-12T23:54:04.810 に答える
0

ルートが /#/a/1?foo=123&bar=456 の場合、/#/a/1/b?foo=123&bar=456 にリダイレクトします

私は /#a?foo=bar から /#b?foo=bar に取り組んできました。これは /#a/b?foo=bar に簡単に調整でき、angular-route-segment ライブラリを使用できます。

http://run.plnkr.co/HvSyw4aMUiy1mwC3/#/firstRoute?foo=barでプランカーを実行します。

ここでコードを参照してください

http://plnkr.co/edit/ylFM8BHRXpqpMV7QVEcJ

うまくいくかどうか教えてください。

于 2014-02-12T19:54:59.667 に答える