【问题标题】:Broadcast Parent Event after Child listener loads in AngularJS在 AngularJS 中加载子侦听器后广播父事件
【发布时间】:2015-11-04 15:01:25
【问题描述】:

我有三个控制器 - Parent 和 Child1 和 Child2。 Child1 和 Child2 是父控制器中的选项卡

<div ng-controller="parent">
  <!-- some HTML -->
  <div ng-controller="child1"></div>
  <div ng-controller="child2"></div>
 <!-- Keeping the code minimal for tab. Otherwise its long code -->
</div>

父控制器正在调用服务以获取一些数据,然后广播该事件。孩子监听那个事件,获取数据并执行必要的事情。

但有时我的子监听器在父事件被广播时没有注册(所以子监听器将不起作用)。使用超时功能来延迟事件广播,但它会在缓慢的互联网连接上搞砸。有没有办法确保在我的孩子听众注册后总是启动我的广播收听。以下是截至目前的以下代码

.controller('parent',function($scope,$timeout,someService,){
  someService.then(function(fetchData){
        $timeout(function () {
           $scope.$broadcast('someEvent',fetchData);
         },300);
  })
})
.controller('child1',function($scope){
//Some initializations
  $scope.$on('someEvent', function(event, fetchData) {
       //some work based on fetchData
  });
})

我是 angularJS 新手,在网上找不到合适的解决方案。请指导。在此先感谢:)

【问题讨论】:

  • 你是如何加载child控制器的?我的意思是说带有控制器的子模板?
  • 实际上 parent 包含两个子控制器选项卡。因此,当用户单击选项卡时,子控制器会被加载
  • 0 秒超时应该可以工作
  • @VaibahvShah 试过了。它不工作:(
  • 您也可以在 fetchData 字段上创建 watch 函数。在 watch 表达式中广播。

标签: javascript angularjs angular-broadcast


【解决方案1】:

可能最好的解决方案是@Vaibahv Shah 所说的,在子控制器内的父值上添加$scope.$watch

像这样:

.controller('parent',function($scope,$timeout,someService,){
  someService.then(function(fetchData){
        $scope.fetchData = fetchData;
  })
})
.controller('child1',function($scope){
//Some initializations
  $scope.$watch('fetchData', function() {
       //some work based on fetchData
       console.log($scope.fetchData);
  });
})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-01
    • 2014-09-06
    • 2015-08-20
    • 2011-09-19
    • 1970-01-01
    • 2023-04-03
    相关资源
    最近更新 更多