如何触发routeUpdate而不更改$ location.search中的params值

时间:2013-07-31 09:56:10

标签: javascript angularjs angularjs-scope

在我的应用程序中,我使用routeUpdate检查$location.search字符串是否已更改,并在我的视图中相应地导航。 像这样。

$scope.$on('$routeUpdate', function(next, current) {        
    var slide_key = $location.search().slide_key;
    if (slide_key)
    $scope.go_to_slide(slide_key);      
});

另请注意,我使用reloadOnSearch false来重新加载控制器。

通常我会通过更改$location.search触发此操作并正常工作

一切正常但有一种情况我想触发此行为而不更改搜索参数

我尝试将搜索参数再次更改为相同的值 - >没运气。

如果我将其更改为其他值,则routeUpdate会触发,一切正常。

那么我怎样才能手动触发routeUpdate而不更改$location.search中的参数值?

1 个答案:

答案 0 :(得分:6)

我认为您是正确的,如果您想触发真正的$routeUpdate事件而不会影响$location.absUrl()的网址更改,则必须手动干预。

此示例触发$ routeUpdate事件:

<a ng-click="$emit('$locationChangeSuccess','hiya')" href="">update route</a>
// or the precise broadcast would be:
// $rootScope.$broadcast('$locationChangeSuccess',$location.absUrl(), $location.absUrl())

但是在您当前的代码中,您对$routeUpdate中的参数不做任何操作,因此您也可以为$routeUpdate广播假冒或替代事件。

其他看起来更清洁的替代方案有其原因无法运作:

$route.reload()总是强制实际的更新路径:

https://github.com/angular/angular.js/blob/master/src/ngRoute/route.js#L352 https://github.com/angular/angular.js/blob/master/src/ngRoute/route.js#L415

$location依赖于与$browser网址的比较,因此您无法在不更改网址的有意义部分的情况下正常启动它:

https://github.com/angular/angular.js/blob/master/src/ng/location.js#L560