Трансляция родительского события после загрузки дочернего прослушивателя в AngularJS

У меня есть три контроллера: 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 и не нашел подходящего решения в Интернете. Пожалуйста, направляйте. Заранее спасибо :)


person Ankur Aggarwal    schedule 12.08.2015    source источник
comment
как вы загружаете child контроллер? Я имею в виду дочерний шаблон с контроллером?   -  person Pankaj Parkar    schedule 12.08.2015
comment
На самом деле parent содержит две вкладки дочернего контроллера. Поэтому, когда пользователь нажимает на вкладку, загружается дочерний контроллер.   -  person Ankur Aggarwal    schedule 12.08.2015
comment
Тайм-аут с 0 секундами должен работать   -  person Vaibhav Shah    schedule 12.08.2015
comment
@VaibahvShah пробовал. Это не работает :(   -  person Ankur Aggarwal    schedule 12.08.2015
comment
Вы также можете создать функцию наблюдения в поле fetchData. Трансляция внутри выражения наблюдения.   -  person Vaibhav Shah    schedule 12.08.2015
comment
Используете ли вы какой-либо механизм маршрутизации для отображения вкладок?   -  person Pankaj Parkar    schedule 12.08.2015
comment
@AnkurAggarwal У меня такая же проблема. Вы нашли какое-нибудь решение?   -  person Pushkal Boganatham    schedule 02.03.2018


Ответы (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);
  });
})
person Isaac    schedule 12.08.2015