2

我有一个 AngularJS 应用程序,其中视图将$broadcast发生“上下文更改”事件,以告知其子级(ng-include带有控制器和指令的 s,都带有它们的子范围)父视图中发生的事情。现在我正在使用ui-router重构它,这样就会有一个父状态(非抽象)和子状态。

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

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


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

4

1 回答 1

2

对于它的价值,我想分享解决问题的方法。我怀疑这个解决方案的价值,因为我仍然有一些问号。我未能很好地进行根本原因分析,因为我对ui-router$scope.$broadcastui-router$rootScope的内部工作没有足够的了解,并且对如何继承缺乏了解。

这里有两个不同的概念:

  • 范围的父/子关系
  • 父/子状态

根据ui-router文档

没有其他东西[除了解析的依赖项和自定义数据属性]是继承的(没有控制器、模板、url等)。

因此,$broadcast只有从$rootScope. 但是,这不能与我现在正在工作的实施协作。

无论如何,我的问题似乎是由于在$stateChangeSuccess. 当我对孩子开火时$viewContentLoaded会收到它。注意$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

因为这个,我经常欢呼得太早:)

于 2013-09-30T04:02:20.137 回答