在ui-router状态之间发送事件

时间:2013-09-25 15:31:35

标签: javascript angularjs angularjs-scope angular-ui-router

我有一个AngularJS应用程序,其中视图将$broadcast一个“上下文已更改”事件,告诉其子项(ng-include s带有控制器和指令,所有这些都带有子范围),以了解其中的内容。父视图。现在我refactoring使用 ui-router ,这样就会有父状态(非抽象)和子状态。

父母仍然高兴地$broadcast其“上下文改变”事件,但是孩子状态永远不会得到它们。这并不完全让我感到惊讶,因为范围不是用 ui-router 继承的,但它对我来说还是个问题。国家间这种沟通的良好模式是什么?我们能否利用我正在尝试连接的州之间存在父子关系这一事实?我可以使用服务,那么服务$broadcast事件(如$broadcast如何是范围方法而服务没有特定范围)。

我试过调用$rootScope.$broadcast(而不是$scope.$broadcast)无济于事。我只是不确定$rootScope是否是共享范围,或者我实际上期望它只是一个通用定义(如类继承)。


我开始更好地理解调用$rootScope.$broadcast的后果。它将通知世界。我对event.targetScope进行了一些检查(可能是为了确保控制器不会通知自己)。现在我删除了支票我收到消息,但遗憾的是它们太多了(来自层次结构中完全不同位置的控制器)。我只希望父母通知其子女。当我使用ng-include时,表示父范围与子范围。现在我正在使用 ui-router 我希望它能与父状态(控制器)和子状态(控制器)一起使用,但我不知道该怎么做

1 个答案:

答案 0 :(得分:2)

我想分享问题的解决方案。我怀疑这个解决方案的价值,因为我仍然坚持一些问号。我在一个很好的根本原因分析中失败了,因为我对$scope.$broadcast ui-router 的内部工作方式没有足够的见解,并且对$rootScope的方式缺乏了解是继承的。

这里有两个独立的概念:

  • 范围的父/子关系
  • 家长/子女州

Per the ui-router documentation

  

继承[除了已解析的依赖项和自定义数据属性]之外没有其他内容(没有控制器,模板,网址等)。

因此,$broadcast仅在$rootScope完成时才会发挥{期限$stateChangeSuccess的期望(请参见原始问题下方的评论)。但是,这与我现在正在实施的实施无法合作。

在任何情况下,我的问题似乎都是由于$viewContentLoaded过快地触发事件(从父级到子级的控制器)引起的。当我开火$scope.$broadcast时,孩子会收到它。请注意$rootScope;不是$scope.$on('$viewContentLoaded', function(event, toState, toParams, fromState, fromParams) { $scope.$broadcast("contextChanged", $scope._fullContext); })

/parent-state

然后,我剩下要做的就是处理一些无意中发生的事件,从层次结构中的错误位置或在错误的时间点燃,可能因为这不是最合适的设计开始。我用一些模糊逻辑修复它。


下一个gal或家伙的一个提示:一定要测试这两种情况:

  • 用户浏览到/parent-state/child-state,然后将状态更改为/parent-state/child-state
  • 用户立即浏览{{1}}

我经常因此而欢呼:)