我有一个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 我希望它能与父状态(控制器)和子状态(控制器)一起使用,但我不知道该怎么做。
答案 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
我经常因此而欢呼:)