在 ui 路由器状态之间发送事件
Sending events between ui-router states
我有一个 AngularJS 应用程序,其中视图将$broadcast
一个"上下文更改"事件,以告诉其子视图(ng-include
带有控制器和指令,所有带有其子范围(父视图中发生了什么。现在我使用 ui-router 重构它,以便有一个父状态(非抽象(和子状态。
父级仍然很高兴地$broadcast
其"上下文更改"事件,但子状态永远不会得到它们。这并不完全让我感到惊讶,因为 ui-router 不会继承作用域,但这对我来说仍然是一个问题。国家之间这种沟通的良好模式是什么?我们能否利用这样一个事实,即我试图连接的状态之间存在现有的父子关系?我可以使用服务,然后服务如何$broadcast
事件(因为$broadcast
是一个作用域方法,而该服务没有特定的作用域(。
我试过打电话给$rootScope.$broadcast
(而不是$scope.$broadcast
(无济于事。我只是不确定$rootScope
是否是一个共享范围,或者我实际上期望它只是一个通用定义(如类继承(。
我开始更好地理解打电话给$rootScope.$broadcast
的后果.它将通知世界。我对event.targetScope
进行了一些检查(可能是为了确保控制器不会通知自己(。现在我删除了检查,我收到了消息,但不幸的是,它们太多了(来自层次结构中完全不同的位置的控制器(。我只希望父母通知其孩子。当我使用ng-include
时,这意味着父范围与子范围。现在我正在使用ui路由器,我希望它与父状态(控制器(和子状态(控制器(一起使用,但我不知道该怎么做。
对于它的价值,我想分享这个问题的解决方案。我怀疑这个解决方案的价值,因为我仍然被一些问号所困扰。我在良好的根本原因分析方面失败了,因为我对$scope.$broadcast
和ui-router的内部工作原理没有足够的了解,并且对$rootScope
是如何继承的缺乏了解。
这里有两个独立的概念在起作用:
- 作用域的父/子关系
- 父/子状态
根据 ui 路由器文档:
不继承任何其他 [除了解析的依赖项和自定义数据属性] (没有控制器、模板、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
我经常因为这个:)过早地欢呼
- 如何使用Node.js在JavaScript模块文件之间使用事件处理程序
- 如何在jQuery中获取两个事件之间的时间差
- Angularjs事件与发布/订阅指令之间的通信
- 如何在JavaScript中测量交互和mousedown事件之间的延迟
- jQuery:存储自定义事件之间的数据
- Socket.IO:如何在同一服务器中的Socket.on()事件之间通信/交换数据
- 如何识别源自JS脚本的http请求与HTML
- j查询复选框的更改和单击事件之间的差异
- 在事件之间传递变量
- 用户名实时更改中的 keyup() 事件和 change() 事件之间的差异
- jQuery mobile - 如何在
和 Click 事件之间连接 - 如何在两个onclick事件之间传递参数
- js文件或html模板中的init事件之间的区别
- 在两个jQuery点击事件之间传递数据
- .click()事件之间的jQuery焦点
- html页面显示和加载事件之间的区别是什么?
- 在许多事件之间找到顺序
- 在鼠标事件之间传递数据
- 拖放事件之间是否有定义的顺序
- 层叠鼠标事件之间的Div与画布在它的顶部