我 routeProvider 路由具有 reloadOnSearch 设置为 假 :
$routeProvider .when( "/film/list", { templateUrl: '/film/list.html', controller: FilmListController, reloadOnSearch: false } .... )
我这样做是因为我不希望在查询字符串更改后重新加载整个控制器,但是我仍然使用它,并且url看起来像这样:film/list?sort=isbn&order=asc&offset=0。现在,每当查询字符串更改时,我都想从控制器中调用一个函数。所以我试图在控制器中设置一个 $ watch :
film/list?sort=isbn&order=asc&offset=0
$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() 不起作用?
您可以$routeUpdate在控制器中监听事件:
$routeUpdate
$scope.$on('$routeUpdate', function(){ $scope.sort = $location.search().sort; $scope.order = $location.search().order; $scope.offset = $location.search().offset; });