一尘不染

reloadOnSearch为false时,$ location.search上的AngularJs $ watch无法正常工作

angularjs

routeProvider 路由具有 reloadOnSearch 设置为

 $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() 不起作用?


阅读 238

收藏
2020-07-04

共1个答案

一尘不染

您可以$routeUpdate在控制器中监听事件:

$scope.$on('$routeUpdate', function(){
  $scope.sort = $location.search().sort;
  $scope.order = $location.search().order;
  $scope.offset = $location.search().offset;
});
2020-07-04