无法从 angularjs 中的父控制器广播事件
Unable to broadcast event from parent controller in angularjs
我有一个具有父子关系的两个控制器:
这是父控制器的路由:
angular.module('app')
.config(function ($stateProvider) {
$stateProvider
.state('data-show', {
url: '/data',
templateUrl: 'app/data.html',
controller: 'DataCtrl'
});
});
这是父控制器的HTML:
<div class="block-header">
...
...
<div ng-include="'components/child_page.html'"></div>
</div>
父控制器代码:
angular.module('app')
.controller('DataCtrl', function ($scope) {
$rootScope.$broadcast('someEvent', [1,2,3]);
});
子控制器是 child_page.html 页面的一部分,它使用 ng-include
标签包含在父页面中,如上所示。
这是子控制器的样子:
angular.module('app')
.controller('childCtrl', function ($scope) {
$scope.$on('someEvent', function(event, mass) {
console.log('EVENT CALLED');
});
});
HTML 子页面:
<div ng-controller="childCtrl">
<div id="myGrid"></div>
</div>
但是即使我从父控制器广播事件,子页面也不会调用该事件。
来自评论:
I would bet the reason is that the child controller is not loaded yet when the event is broadcasted - so there is noone there to listen.
并且似乎得到验证:
before I broadcast the event, I am writing to console "broadcasting" & on the first line of child controller, I am writing to "console child controller is loaded". If I check console now, I first see "broadcasting" message and then "child controller is loaded".
查看 ng-include
的文档,它会在加载内容时发出 $includeContentLoaded
事件。所以第一种方法是:
// parent controller:
$rootScope.$on('$includeContentLoaded', function() {
$rootScope.$broadcast('someEvent', [1,2,3]);
});
后期可以根据事件的参数进行优化
我是在回答我自己的问题,希望对大家有所帮助。
正如 Nikos Paraskevopoulos
所建议的,当我试图从父控制器广播事件时,子控制器没有加载。
所以我将父控制器更改为:
angular.module('app')
.controller('DataCtrl', function ($scope,$timeout) {
$timeout(function () {
$scope.$broadcast('someEvent', [1, 2, 3]);
}, 300);
});
我添加了 300 毫秒的延迟,以允许加载子控制器。
我有一个具有父子关系的两个控制器:
这是父控制器的路由:
angular.module('app')
.config(function ($stateProvider) {
$stateProvider
.state('data-show', {
url: '/data',
templateUrl: 'app/data.html',
controller: 'DataCtrl'
});
});
这是父控制器的HTML:
<div class="block-header">
...
...
<div ng-include="'components/child_page.html'"></div>
</div>
父控制器代码:
angular.module('app')
.controller('DataCtrl', function ($scope) {
$rootScope.$broadcast('someEvent', [1,2,3]);
});
子控制器是 child_page.html 页面的一部分,它使用 ng-include
标签包含在父页面中,如上所示。
这是子控制器的样子:
angular.module('app')
.controller('childCtrl', function ($scope) {
$scope.$on('someEvent', function(event, mass) {
console.log('EVENT CALLED');
});
});
HTML 子页面:
<div ng-controller="childCtrl">
<div id="myGrid"></div>
</div>
但是即使我从父控制器广播事件,子页面也不会调用该事件。
来自评论:
I would bet the reason is that the child controller is not loaded yet when the event is broadcasted - so there is noone there to listen.
并且似乎得到验证:
before I broadcast the event, I am writing to console "broadcasting" & on the first line of child controller, I am writing to "console child controller is loaded". If I check console now, I first see "broadcasting" message and then "child controller is loaded".
查看 ng-include
的文档,它会在加载内容时发出 $includeContentLoaded
事件。所以第一种方法是:
// parent controller:
$rootScope.$on('$includeContentLoaded', function() {
$rootScope.$broadcast('someEvent', [1,2,3]);
});
后期可以根据事件的参数进行优化
我是在回答我自己的问题,希望对大家有所帮助。
正如 Nikos Paraskevopoulos
所建议的,当我试图从父控制器广播事件时,子控制器没有加载。
所以我将父控制器更改为:
angular.module('app')
.controller('DataCtrl', function ($scope,$timeout) {
$timeout(function () {
$scope.$broadcast('someEvent', [1, 2, 3]);
}, 300);
});
我添加了 300 毫秒的延迟,以允许加载子控制器。