最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - $broadcast and $on is not working on template which is based on ng-if - Stack Overflow

programmeradmin0浏览0评论

I got problem to broadcast event from parent scope to child scope which I think the root core might be child controller is not initialized.

Assume I have 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>

and controllers:

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);
  });
}]);

When the button Show Template is clicked, the flag showTemplate is set to show the template, also an event showEvent is broadcast-ed to child scope.

But the scope in ChildController cannot catch this event since the child controller might initialize later.

Is there any way to work around this?

The code in here:

I got problem to broadcast event from parent scope to child scope which I think the root core might be child controller is not initialized.

Assume I have 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>

and controllers:

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);
  });
}]);

When the button Show Template is clicked, the flag showTemplate is set to show the template, also an event showEvent is broadcast-ed to child scope.

But the scope in ChildController cannot catch this event since the child controller might initialize later.

Is there any way to work around this?

The code in here: http://plnkr.co/edit/HV6aco

Share Improve this question edited Aug 21, 2013 at 12:37 cuongle asked Aug 21, 2013 at 12:12 cuonglecuongle 75.3k30 gold badges154 silver badges212 bronze badges
Add a ment  | 

3 Answers 3

Reset to default 6

Wrap the call of broadcast into a $timeout and you are good to go i believe

$timeout(function() { $scope.$broadcast("showEvent"); },0);

Since you are using ng-if the DOM nodes with the ChildController are just not present at the time when the event is fired.

I see two possibilities:

  1. Move the ChildController somewhere above the ng-if

  2. use ng-show instead of ng-if

See the updated plunkr: http://plnkr.co/edit/NluFBJ

However, if you are really only interested in getting notified when the template is being created, then I would suggest to just go for @Roy Daniels solutions and just don't use $broadcast/$on at all and instead put the code you wanted to run directly into the ChildController since that will be executed anyway each time the template is being created.

You don't need to use $broadcast/$on here. Every time you show your template the code in ChildController will be initialized and run.

Take a look at this Plunker: http://plnkr.co/edit/liON6k?p=preview

发布评论

评论列表(0)

  1. 暂无评论
ok 不同模板 switch ($forum['model']) { /*case '0': include _include(APP_PATH . 'view/htm/read.htm'); break;*/ default: include _include(theme_load('read', $fid)); break; } } break; case '10': // 主题外链 / thread external link http_location(htmlspecialchars_decode(trim($thread['description']))); break; case '11': // 单页 / single page $attachlist = array(); $imagelist = array(); $thread['filelist'] = array(); $threadlist = NULL; $thread['files'] > 0 and list($attachlist, $imagelist, $thread['filelist']) = well_attach_find_by_tid($tid); $data = data_read_cache($tid); empty($data) and message(-1, lang('data_malformation')); $tidlist = $forum['threads'] ? page_find_by_fid($fid, $page, $pagesize) : NULL; if ($tidlist) { $tidarr = arrlist_values($tidlist, 'tid'); $threadlist = well_thread_find($tidarr, $pagesize); // 按之前tidlist排序 $threadlist = array2_sort_key($threadlist, $tidlist, 'tid'); } $allowpost = forum_access_user($fid, $gid, 'allowpost'); $allowupdate = forum_access_mod($fid, $gid, 'allowupdate'); $allowdelete = forum_access_mod($fid, $gid, 'allowdelete'); $access = array('allowpost' => $allowpost, 'allowupdate' => $allowupdate, 'allowdelete' => $allowdelete); $header['title'] = $thread['subject']; $header['mobile_link'] = $thread['url']; $header['keywords'] = $thread['keyword'] ? $thread['keyword'] : $thread['subject']; $header['description'] = $thread['description'] ? $thread['description'] : $thread['brief']; $_SESSION['fid'] = $fid; if ($ajax) { empty($conf['api_on']) and message(0, lang('closed')); $apilist['header'] = $header; $apilist['extra'] = $extra; $apilist['access'] = $access; $apilist['thread'] = well_thread_safe_info($thread); $apilist['thread_data'] = $data; $apilist['forum'] = $forum; $apilist['imagelist'] = $imagelist; $apilist['filelist'] = $thread['filelist']; $apilist['threadlist'] = $threadlist; message(0, $apilist); } else { include _include(theme_load('single_page', $fid)); } break; default: message(-1, lang('data_malformation')); break; } ?>