角度控制器 - 双向广播

时间:2016-01-21 08:41:57

标签: javascript angularjs angular-ui-router broadcast

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

更新: 使用ui-router $ stateChangeStart事件是一个很好的方法,但仍然不完整。 现在的问题是, 我的主控制器托管ui-router,菜单栏有一个进度条。 主控制器注册到$ stateChangeStart并处理进度条,但是也注册到该事件的子视图阻止了默认值。这意味着控制器现在处于不一致模式。主控制器已经处理了进度条,视图本身没有改变。 请指教

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

$rootScope.$broadcast('cancelStateChange');