4

我在将事件从父范围广播到子范围时遇到问题,我认为根核心可能是子控制器未初始化。

假设我有html

<div ng-controller="ParentController">
  <button type="button" ng-click="show()">Show Template</button>

  <div ng-if="showTemplate">
    <div ng-include="'template.html'" ng-controller="ChildController"></div>    
  </div>

</div>

和控制器:

var myApp = angular.module("myApp", []);

myApp.controller('ParentController', ['$scope', function ($scope) {   
  $scope.show = function(){
    $scope.showTemplate = true;
    $scope.$broadcast("showEvent", 1);
  };

}]);

myApp.controller('ChildController', ['$scope', function ($scope) {
  $scope.$on("showEvent", function(event, id){
    alert(id);
  });
}]);

单击按钮时Show Template,标志showTemplate设置为显示模板,事件也showEvent被广播到子范围。

但是ChildController由于子控制器可能稍后会初始化,因此 in 的范围无法捕获此事件。

有没有办法解决这个问题?

这里的代码:http: //plnkr.co/edit/HV6aco

4

3 回答 3

6

将广播的调用包装成一个$timeout,我相信你很高兴

$timeout(function() { $scope.$broadcast("showEvent"); },0);
于 2013-08-21T12:25:03.237 回答
4

由于您使用ng-if的 DOM 节点ChildController在事件触发时不存在。

我看到两种可能性:

  1. 移动ChildController上面的某处ng-if

  2. 使用ng-show而不是ng-if

查看更新的 plunkr:http ://plnkr.co/edit/NluFBJ

但是,如果您真的只对在创建模板时收到通知感兴趣,那么我建议您选择@Roy Daniels 解决方案,根本不要使用$broadcast/$on而是将您想要运行的代码直接放入因为ChildController每次创建模板时都会执行。

于 2013-08-21T12:27:26.090 回答
1

你不需要在这里使用 $broadcast/$on 。每次显示模板时,ChildController 中的代码都会被初始化并运行。

看看这个 Plunker:http ://plnkr.co/edit/liON6k?p=preview

于 2013-08-21T12:26:05.727 回答