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

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

我有一个 AngularJS 应用程序,其中 View 将 $broadcast 一个“上下文已更改”事件来告诉其子级(带有 Controller 和指令的 ng-include ,所有这些都带有它们的子范围)了解父 View 中发生的情况。现在我是refactoring使用ui-router,这样就会有一个父状态(非抽象)和子状态。

父状态仍然高兴地 $broadcasting 其“上下文更改”事件,但子状态永远不会获取它们。这并不完全让我感到惊讶,因为范围不是通过 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.$broadcastui-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/

相关文章:

javascript - 我可以在 Ember 2.1 中升级 jQuery 2 吗?

javascript - 不同表格按表格标题分开排序

javascript - 从 Angular Controller 访问 javascript 数组的最佳方法

angularjs - Controller 如何与 AngularJS 中的指令对话?

javascript - Controller 范围内的变量

Javascript - split方法中的多个正则表达式

javascript - 防止在单击超链接时触发父容器单击事件

javascript - AngularJS 不打印变量

javascript - 在服务中完成工作后, Angular 服务未在 Controller 中返回成功

javascript - 如何使用javascript删除html标签之间的空白?