angular 控制器 - 双向广播

angular controllers - two way broadcasting

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

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

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

$rootScope.$broadcast('cancelStateChange');

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