$locationChangeSuccess 触发四次
$locationChangeSuccess triggers four times
我是 angular Js.
的新手
我的申请流程如下:
1) 我有一个视图控制器,其中每个视图控制器都在 Breadcrumbs 工厂的帮助下设置面包屑数据。
2) 面包屑工厂从视图控制器获取数据并将数据附加到 $location.$$state object。(存储在状态 object 中的原因是如果按下后退按钮,视图控制器没有实例化,所以我可以参考面包屑的历史数据)下面是将数据附加到状态的代码 object:
var state = $location.state();
state.breadcrumb = breadcrumbData;
$location.replace().state(state);
3) 我还在全局 header 上创建了面包屑指令,它将在 $locationChangeSuccess 事件中显示面包屑。指令将从 $location.state(); 获取数据;出厂设置。
我的问题是当位置改变时,$locationChangeSuccess 事件回调函数执行四次。
下面是我的指令代码:
angular.module('cw-ui')
.directive('cwBreadcrumbs', function($location, Breadcrumbs, $rootScope) {
return {
restrict: 'E',
replace: true,
templateUrl: 'UI/Directives/breadcrumb',
link: function($scope, element){
//some code for element...
$rootScope.$on('$locationChangeSuccess', function(event, url, oldUrl, state, oldState){
// get data from history of location state
var data = $location.state();
console.log(data);
});
}
};
});
输出如下:
Object {}
Object {key: "Core/Views/dash:1", view: "Core/Views/dash", parameters: Array[0], breadcrumb: Array[2]}
Object {key: "Core/Views/dash:1", view: "Core/Views/dash", parameters: Array[0]}
Object {key: "Core/Views/dash:1", view: "Core/Views/dash", parameters: Array[0]}
面包屑:Array[2] 第 1、3、4 次消失。我真的不知道是什么导致这个回调函数执行了四次,而且我对问题一无所知,也不知道如何调试。请大家帮忙!
我自己 运行 之后,问题在于您正在使用根作用域从一个指令中绑定 locationChangeSuccess 事件,该指令要么在单个页面上多次遇到,要么遇到多次重新访问页面的次数:
$rootScope.$on('$locationChangeSuccess', function(event, url, oldUrl, state, oldState){
由于您正在绑定到 rootScope,并且 rootScope 没有超出范围,因此不会为您清除事件绑定。
在您的 link 函数中,您应该为元素 $destroy 添加一个侦听器,并从原始绑定中捕获 return 值,以便稍后可以解除绑定。
首先:捕获return值:
var unbindChangeSuccess = $rootScope.$on('$locationChangeSuccess' ...
接下来,在您的 destroy 方法中取消绑定该值:
element.on('$destroy', function() {
unbindChangeSuccess();
});
这应该可以解决对您的 locationChangeSuccess 的多次调用! :)
我是 angular Js.
的新手我的申请流程如下:
1) 我有一个视图控制器,其中每个视图控制器都在 Breadcrumbs 工厂的帮助下设置面包屑数据。
2) 面包屑工厂从视图控制器获取数据并将数据附加到 $location.$$state object。(存储在状态 object 中的原因是如果按下后退按钮,视图控制器没有实例化,所以我可以参考面包屑的历史数据)下面是将数据附加到状态的代码 object:
var state = $location.state();
state.breadcrumb = breadcrumbData;
$location.replace().state(state);
3) 我还在全局 header 上创建了面包屑指令,它将在 $locationChangeSuccess 事件中显示面包屑。指令将从 $location.state(); 获取数据;出厂设置。
我的问题是当位置改变时,$locationChangeSuccess 事件回调函数执行四次。
下面是我的指令代码:
angular.module('cw-ui')
.directive('cwBreadcrumbs', function($location, Breadcrumbs, $rootScope) {
return {
restrict: 'E',
replace: true,
templateUrl: 'UI/Directives/breadcrumb',
link: function($scope, element){
//some code for element...
$rootScope.$on('$locationChangeSuccess', function(event, url, oldUrl, state, oldState){
// get data from history of location state
var data = $location.state();
console.log(data);
});
}
};
});
输出如下:
Object {}
Object {key: "Core/Views/dash:1", view: "Core/Views/dash", parameters: Array[0], breadcrumb: Array[2]}
Object {key: "Core/Views/dash:1", view: "Core/Views/dash", parameters: Array[0]}
Object {key: "Core/Views/dash:1", view: "Core/Views/dash", parameters: Array[0]}
面包屑:Array[2] 第 1、3、4 次消失。我真的不知道是什么导致这个回调函数执行了四次,而且我对问题一无所知,也不知道如何调试。请大家帮忙!
我自己 运行 之后,问题在于您正在使用根作用域从一个指令中绑定 locationChangeSuccess 事件,该指令要么在单个页面上多次遇到,要么遇到多次重新访问页面的次数:
$rootScope.$on('$locationChangeSuccess', function(event, url, oldUrl, state, oldState){
由于您正在绑定到 rootScope,并且 rootScope 没有超出范围,因此不会为您清除事件绑定。
在您的 link 函数中,您应该为元素 $destroy 添加一个侦听器,并从原始绑定中捕获 return 值,以便稍后可以解除绑定。
首先:捕获return值:
var unbindChangeSuccess = $rootScope.$on('$locationChangeSuccess' ...
接下来,在您的 destroy 方法中取消绑定该值:
element.on('$destroy', function() {
unbindChangeSuccess();
});
这应该可以解决对您的 locationChangeSuccess 的多次调用! :)