47

ルートのrouteProviderでreloadOnSearchfalseに設定されています

 $routeProvider
     .when(
        "/film/list",
         {
          templateUrl: '/film/list.html', 
          controller: FilmListController,
          reloadOnSearch: false
          } 
          ....

  )

これを行ったのは、クエリ文字列の変更後にコントローラー全体を再読み込みしたくないためですが、それでも使用しており、URLは次のようになっていますfilm/list?sort=isbn&order=asc&offset=0。これで、クエリ文字列が変更されるたびに、コントローラーから関数を呼び出したいと思います。そこで、コントローラーに$watchを設定しようとしました。

$scope.location = $location;
$scope.$watch( 'location.search()', function( search) {
        $scope.list();
 });

しかし、これは機能しません。クエリ文字列の個々のパラメータの変更を監視するように$watchを設定すると、機能します。ただし、クエリ文字列のすべてのパラメータに$watchを設定したくありません。私が今使っている解決策はこれです:

$scope.location = $location;
$scope.$watch( 'location.url()', function( url ) {
    if($location.path() == '/film/list')
        $scope.list();
 });

したがって、検索を監視する代わりに、URL全体を監視し、次に、パスがrouteProviderで設定したパスであるかどうかを確認して、条件付きで関数を呼び出します。このソリューションで私が気に入らないのは、一致する$location.pathの値を明示的に入力する必要があることです。

誰かがより良い解決策を提案できますか、そしておそらく$watchが$location.search()で機能しない理由を私に説明できますか?

4

6 に答える 6

79

$routeUpdateコントローラでイベントをリッスンできます。

$scope.$on('$routeUpdate', function(){
  $scope.sort = $location.search().sort;
  $scope.order = $location.search().order;
  $scope.offset = $location.search().offset;
});
于 2013-02-26T17:52:21.973 に答える
27

Stewiesの答えは正しいです$routeUpdate。より効率的であるため、そのイベントをリッスンする必要があります。

しかし、あなたの時計が動かない理由を答えるために。を見るときlocation.search()は、検索メソッドが返す参照が同じかどうかを見ています。また、呼び出すたびに同じオブジェクトへの参照が返されるため、時計が起動しません。つまり、検索パラメーターが変更されても、返されるのは同じオブジェクトです。これを回避するには、 true を の 3 番目の引数として渡すことができます$watch。これにより、Angular は参照ではなく値で比較するようになります。ただし、このような監視を作成する場合は注意が必要です。これは、より多くのメモリを消費し、実行に時間がかかるためです。だからステューウィーが言ったようにやるべきだ。

于 2013-02-26T19:26:18.287 に答える
12

使用する

$scope.$watch(function(){ return $location.search() }, function(params){
    console.log(params);
});

代わりは。

于 2014-12-03T14:21:11.457 に答える
1

routeUpdateコントローラーで次のように変更を確認します。

 $scope.$watch('$routeUpdate', function(){
     $scope.sort = $location.search().sort;
     $scope.order = $location.search().order; 
 });
于 2014-02-10T21:44:14.240 に答える