$emit from子控制器工作,但是$broadcast from父控制器不起作用
$emit from child controller works, but $broadcast from parent scope doesn't
当我调用$scope.$broadcast
时,我的孩子正在听的任何事件都没有被触发。下面是一个简化的示例:
HTML
下面是我想要完成的一个简单的例子:
<div ng-app="app" ng-controller="parentCtrl">
<div ng-controller="childCtrl">
<b>Parent Event:</b> {{outer}}<br />
<b>Child Event:</b> {{inner}}<br />
</div>
</div>
AngularJs
mc = angular.module('app', [
'app.controllers',
]);
angular.module('app.controllers', [])
.controller('parentCtrl', ['$scope', '$http', '$q', function ($scope, $http, $q) {
$scope.outer = 'not executed';
$scope.$broadcast('EventFromParent');
$scope.$on('EventFromChild', function () {
$scope.outer = 'executed';
});
}])
.controller('childCtrl', ['$scope', '$http', function ($scope, $http) {
$scope.inner = 'not executed';
$scope.$on('EventFromParent', function () {
$scope.inner = 'executed';
});
$scope.$emit('EventFromChild');
}]);
输出我希望看到父级和子级都被触发,但是我没有为子级触发。
EXPECTED ACTUAL
------ ------
Parent Event: triggered Parent Event: triggered
Child Event: triggered Child Event: not triggered
我的猜测是子控制器还没有准备好接收事件。我需要等到DOM准备好,但我不知道如何在Angular中做到这一点。你可以随意告诉我,我做的事情也是这样做的。
<标题> Plunkr 标题>问题是父控制器中的$scope.$broadcast
在子控制器中的$scope.$on
之前被调用,因此在'EventFromParent'广播到子范围时没有此事件的侦听器。
您需要在广播或发出事件之前注册事件侦听器。在您的情况下,实现这一目标的一种方法是使用$timeout
:
$timeout(function() {
$scope.$broadcast('EventFromParent');
});
(你需要先注入$timeout
服务)
这样,您有效地延迟了事件广播,并且事件侦听器有机会注册自己,因此当事件发生时,侦听器将被调用。
相关文章:
- 在指令控制器中使用$attrs时出现问题
- 有没有任何方法可以将控制器从文件加载到ui路由器$stateProvider中
- 从控制器返回后Ajax启动事件激发
- 获取@ResponseBody的一部分作为主干和Spring MVC控制器之间的参数
- 如何在单击复选框后调用控制器方法
- 在控制器和数据对象之间同步数据
- 将Javascript数组发送到控制器ASP.NET MVC
- 角度控制器结构
- 如何在Jquery中发布后将值从视图返回到控制器
- 将值从html传递到AngularJS控制器
- 从我的控制器返回一个不同于200的代码以触发ajax错误,这被认为是一种好的做法吗
- 从控制器继承了隔离的作用域以生成可重用的指令
- Flash Uploadify在调用我的MVC控制器时没有保留会话/授权
- 为什么不't我的变量在我的控制器中填充后在我的视图中呈现
- Nodejs API控制器,用于在API之间切换
- 如何在Angular单元测试中从另一个控制器的rootScope将方法添加到rootScope中
- 将不在模型中的数据返回到mvc控制器
- 未激发路由的控制器属性上的观察者
- 为什么Angular JS控制器中的这个from作用域变量不被设置为true ?
- $emit from子控制器工作,但是$broadcast from父控制器不起作用