我有一个 AngularJS 应用程序,其中 View 将 $broadcast
一个“上下文已更改”事件来告诉其子级(带有 Controller 和指令的 ng-include
,所有这些都带有它们的子范围)了解父 View 中发生的情况。现在我是refactoring使用ui-router,这样就会有一个父状态(非抽象)和子状态。
父状态仍然高兴地 $broadcast
ing 其“上下文更改”事件,但子状态永远不会获取它们。这并不完全让我感到惊讶,因为范围不是通过 ui-router 继承的,但这对我来说仍然是一个问题。国家之间的这种沟通的良好模式是什么?我们可以利用我尝试连接的州之间存在现有的父子关系这一事实吗?我可以使用服务吗,那么服务如何 $broadcast
事件(因为 $broadcast
是一个作用域方法,而该服务没有特定的作用域)。
我尝试调用 $rootScope.$broadcast
(而不是 $scope.$broadcast
),但无济于事。我只是不确定 $rootScope
是否是共享作用域,或者我实际上期望它只是一个通用定义(如类继承)。
我开始更好地理解调用 $rootScope.$broadcast
的后果。它将通知全世界。我对 event.targetScope 进行了一些检查(可能是为了确保 Controller 不会通知自己)。现在我已经删除了检查,我收到了消息,但不幸的是消息太多(来自层次结构中完全不同位置的 Controller )。我只希望 parent 通知其 child 。当我使用 ng-include 时,这意味着父作用域与子作用域。现在我正在使用 ui-router 我希望它能够与父状态( Controller )和子状态( Controller )一起使用,但我不知道该怎么做。
最佳答案
无论如何,我想分享问题的解决方案。我怀疑这个解决方案的值(value),因为我仍然有一些问号。我未能进行良好的根本原因分析,因为我对 $scope.$broadcast
和 ui-router 的内部运作没有足够的见解,并且缺乏理解$rootScope
是如何继承的。
这里有两个不同的概念:
- 范围的父/子关系
- 父/子状态
Per the ui-router documentation :
Nothing else [than resolved dependencies and custom data properties] is inherited (no controllers, templates, url, etc).
因此,期望(请参阅原始问题下面的评论)$broadcast
仅在从 $rootScope
完成时才起作用。然而,这不能与我现在正在工作的实现协作。
无论如何,我的问题似乎是由于在 $stateChangeSuccess
上过早触发事件(从父状态 Controller 到子状态 Controller )引起的。当我触发 $viewContentLoaded
时, child 会收到它。注意$scope.$broadcast
;不是 $rootScope
。
$scope.$on('$viewContentLoaded', function(event, toState, toParams, fromState, fromParams) {
$scope.$broadcast("contextChanged", $scope._fullContext);
})
然后我剩下要做的就是处理一些无意的事件,这些事件是从层次结构中的错误位置或在错误的时间触发的,这可能是因为这不是最适合的设计。我用一些模糊逻辑修复了它。
给下一个女孩或男人的一个提示:一定要测试这两种情况:
- 用户浏览到
/parent-state
,然后将状态更改为/parent-state/child-state
- 用户立即浏览到
/parent-state/child-state
因此我经常欢呼得太早:)
关于javascript - 在 ui-router 状态之间发送事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19009135/