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このイベントをキャッチできません。

これを回避する方法はありますか?

ここのコード: http://plnkr.co/edit/HV6aco

4

3 に答える 3

4

ng-ifDOM ノードを使用してChildControllerいるため、イベントが発生した時点では存在しません。

2 つの可能性があります。

  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 のコードが初期化されて実行されます。

このプランカーを見てみましょう: http://plnkr.co/edit/liON6k?p=preview

于 2013-08-21T12:26:05.727 に答える