2016-01-21 49 views
0

我有一个控制器,包裹UI路由器和控制其流量(如菜单栏)。 当用户按下菜单项时,有一个功能可以改变ui-router状态并将一个事件广播给内部控制器。 此ui路由器内的每个内部控制器都可以监听并处理此事件。 内部控制器正在对此事件进行验证,但如果验证失败,我无法撤消状态更改。 任何想法如何解决这个问题? 感谢角度控制器 - 双向广播

更新: 使用UI路由器$ stateChangeStart事件是一个好方法,但仍然不完整的。 现在的问题是, 我的主控制器,主机的UI路由器和菜单栏有一个进度条。 主控制器注册到$ stateChangeStart并处理进度条,但也注册到事件的子视图阻止默认值。这意味着控制器现在处于不一致的模式。主控制器已经照顾了进度条并且视图本身没有改变。 请告知

+1

您可以添加监听stateChange开始活动,而且只有改变状态时,你的条件satified(把验证在stateChange启动事件处理程序) –

回答

1

ui-router本身发出$stateChangeStart事件。

您的控制器可以使用event.preventDefault()来防止发生转换。

$scope.$on('$stateChangeStart', 
    function(event, toState, toParams, fromState, fromParams){ 
     if (notOK) { 
      event.preventDefault(); 
     }; 
}) 

欲了解更多信息,请参阅UI-Router state.$state API Reference -- events - $stateChangeStart

+0

就像一个魅力! !感谢你们俩:) – Avi

+0

好吧,我太早开心了:)现在我面临着另一个问题。我有两个控制器注册此事件。主要(与菜单)和子视图,当子视图触发preventDefault时,它不会停止父功能做它的工作,现在我处于不一致的状态,当主控制器已经改变他的状态,但子控制器preventDefault 。这是否也有解决方案?谢谢 – Avi

+0

我找到了解决方案,我将主控制器工作移至$ stateChangeSuccess事件。非常感谢大家! – Avi

0

使用$rootScope广播取消事件并捕获菜单控制器中的事件。

$rootScope.$broadcast('cancelStateChange');