UI路由器stateChangeStart激发了50次
问题描述:
UPDATE:我添加了一个控制台语句,并且似乎这个侦听器处理程序被调用了50次,对于这个事件。或者可以说这次事件是50次发射。任何想法为什么?可以做什么?UI路由器stateChangeStart激发了50次
修复更新:
angular.module("main.loadbalancer").run(function($rootScope, $state, DeviceVal){
$rootScope.$on('$stateChangeStart', function(event, toState){
if (DeviceVal.readonly && toState.name == "main.loadbalancer.vips") {
event.preventDefault();
$state.transitionTo("main.loadbalancer.readonly", {id: "534584"});
console.log(toState);
}
});
});
每当$state.transitionTo("main.loadbalancer.readonly");
是跑了,我得到一个UI Router: RangeError: Maximum call stack size exceeded
。不确定在哪里或要做什么。
angular.module("main.loadbalancer").run(function($rootScope, $state, DeviceVal){
$rootScope.$on('$stateChangeStart', function(event){
if (DeviceVal.readonly) {
$state.transitionTo("main.loadbalancer.readonly");
event.preventDefault();
return false;
}
});
});
angular.module("main.loadbalancer", ["ui.bootstrap", "ui.router"]).config(function($stateProvider) {
return $stateProvider.state("main.loadbalancer", {
resolve: {
waitForDeviceId: function($state, $q, $timeout, DeviceVal) {
var deferred = $q.defer();
$timeout(function() {
if (DeviceVal.lb) {
deferred.resolve();
} else {
deferred.reject();
}
}, 1000);
return deferred.promise;
}
},
url: "device/:id",
views: {
"[email protected]": {
templateUrl: "loadbalancer/loadbalancer.html",
controller: "LoadBalancerCtrl"
}
}
}).state("main.loadbalancer.vips", {
url: "/vips",
templateUrl: "loadbalancer/vip-table.html",
controller: "VipListCtrl"
}).state("main.loadbalancer.nodes", {
url: "/nodes",
templateUrl: "loadbalancer/node-table.html",
controller: "NodeListCtrl"
}).state("main.loadbalancer.admin", {
url: "/admin",
templateUrl: "loadbalancer/admin.html",
controller: "AdminCtrl"
}).state("main.loadbalancer.readonly", {
url: "/readonly",
templateUrl: "loadbalancer/readonly.html"
});
});
RangeError: Maximum call stack size exceeded
at http://10.14.213.161:9000/bower_components/angular/angular.js:7004:18
at Scope.$broadcast (http://10.14.213.161:9000/bower_components/angular/angular.js:12456:15)
at Object.transitionTo (http://10.14.213.161:9000/bower_components/angular-ui-router/release/angular-ui-router.js:2032:26)
at http://10.14.213.161:9000/loadbalancer/services/readonly.service.js:4:16
at Scope.$broadcast (http://10.14.213.161:9000/bower_components/angular/angular.js:12454:28)
at Object.transitionTo (http://10.14.213.161:9000/bower_components/angular-ui-router/release/angular-ui-router.js:2032:26)
at http://10.14.213.161:9000/loadbalancer/services/readonly.service.js:4:16
at Scope.$broadcast (http://10.14.213.161:9000/bower_components/angular/angular.js:12454:28)
at Object.transitionTo (http://10.14.213.161:9000/bower_components/angular-ui-router/release/angular-ui-router.js:2032:26)
at http://10.14.213.161:9000/loadbalancer/services/readonly.service.js:4:16
答
,你所遇到的问题是,你在你的事件处理程序的转换。这造成了无限循环。相反,您需要明确避免在处理程序内部广播$ stateChangeStart。您可以使用notify:false
标志来执行此操作。试试这个:
$state.transitionTo("main.loadbalancer.readonly", null, {notify:false});
您也可以阅读complete API docs。
谢谢,这工作。但不知怎的,它保持'notify:false'保持状态转换不运行。 – dman 2014-10-06 02:38:10
你要把'notify:false'放在哪里?它是否在事件处理程序中?你可以提出你的改变的代码,因为这没有意义。 – 2014-10-06 02:43:14
更新完成。我正在使用'{id:“534584”}“来表示温度。解决问题。另外,toState显示了'Object {url:“/ vips”,templateUrl:“loadbalancer/vip-table.html”,controller:“VipListCtrl”,name:“main.loadbalancer.vips”}' – dman 2014-10-06 02:49:57