web-dev-qa-db-ja.com

ビューを更新せずにルートパラメータを変更する

現在、ページ全体を再読み込みせずにルートパラメータを変更する方法を見つけようとしています。たとえば、私が

http://www.example.com/#/page

ただし、名前を「George」に更新して、ルートを次のように変更します。

http://www.example.com/#/page/george

http://www.example.com/#/page/:name がすでにルーティングされている場合。

場所をリロードすることなく。 $ routeParams.name = "George"を設定できますか?

編集: または、ページを再読み込みまたはリセットせずに http://www.example.com/#/page?name=George を更新する方法はありますか?

20
jbenowitz

わかりました、たくさんの検索の後。私は自分の質問に答えました。

angularのドキュメントで何かを見つけることは信じられないほど不可能ですが、それが見つかると、問題に対する考え方が変わることがあります。

私はここから始めました: http://docs.angularjs.org/api/ng 。$ locationこれが私をここに連れて行きました: http://docs.angularjs.org/guide/dev_guide。 services 。$ locationこの質問に私を連れて行きました: AngularJS Paging with $ location.path but no ngView reload

結局のところ、名前を変更したい場所($ scope。$ watch)に$location.search({name: 'George'});を追加しました。

ただし、下部のStackOverflowリンクにあることを実行し、_$routeProvider.when_に渡すオブジェクトにパラメーターを追加しない限り、これはページをリロードします。私の場合、それは$routeProvider.when('/page', {controller: 'MyCtrl', templateUrl:'path/to/template', reloadOnSearch:false})のようになりました。

これで他の誰かの頭痛が軽減されることを願っています。

41
jbenowitz

私のアプリケーションでは、もう少しエレガントな解決策を見つけました。

$ locationChangeSuccessイベントはブルートフォースアプローチのビットですが、パスをチェックすることで、ルートパスtemplateが変更されていない場合にページのリロードを回避できますが、別のパスに切り替えるとページがリロードされますルートテンプレート:

var lastRoute = $route.current;
$scope.$on('$locationChangeSuccess', function (event) {
    if (lastRoute.$$route.originalPath === $route.current.$$route.originalPath) {
        $route.current = lastRoute;
    }
});

そのコードを特定のコントローラーに追加すると、リロードがよりインテリジェントになります。

11
Jason Young