UI路由器stateChangeStart激发了50次

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

+0

谢谢,这工作。但不知怎的,它保持'notify:false'保持状态转换不运行。 – dman 2014-10-06 02:38:10

+1

你要把'notify:false'放在哪里?它是否在事件处理程序中?你可以提出你的改变的代码,因为这没有意义。 – 2014-10-06 02:43:14

+0

更新完成。我正在使用'{id:“534584”}“来表示温度。解决问题。另外,toState显示了'Object {url:“/ vips”,templateUrl:“loadbalancer/vip-table.html”,controller:“VipListCtrl”,name:“main.loadbalancer.vips”}' – dman 2014-10-06 02:49:57