как транслировать и передавать события другим контроллерам в angular, которые не имеют отношения родитель-потомок

Я пытаюсь получить подсказки из этого сообщения - Работа с $scope.$emit и $scope .$on, но ничего не работает, когда контроллеры никак не связаны друг с другом.

То есть -

<div ng-controller="CtrlA">
</div>

<div ng-controller="CtrlB">
</div>

и в CtrlB я бы сделал что-то вроде этого:

$rootScope.$broadcast('userHasLoggedIn', {})

а в CtrlA я бы слушал так:

$rootScope.$on('userHasLoggedIn, function(event, data){});

И нет - CtrlA никогда не получает транслируемое событие, если я не вложу CtrlB div внутри CtrlA div

Есть идеи?


person David    schedule 19.11.2014    source источник
comment
Возможно, CtrlA не загружается, когда происходит $broadcast.   -  person Chandermani    schedule 19.11.2014
comment
в CtrlA вы должны сделать $scope.$on, так как $scope является дочерней областью от $rootScope   -  person Joao Leal    schedule 19.11.2014
comment
@Changermani CtrlA точно загружен, я поставил предупреждение, и оно сработало. Жоао - это тоже не работает. но вы говорите, что это должно работать, хотя?   -  person David    schedule 20.11.2014
comment
Ваш код должен работать нормально. Вот рабочая демонстрация. В следующий раз сначала создайте jsfiddle/codepen, чтобы лучше продемонстрировать свою проблему.   -  person hon2a    schedule 24.11.2014
comment
Вы пробовали $rootScope.$emit в CtrlB и $rootScope.$on в CtrlA?   -  person gorpacrate    schedule 24.11.2014
comment
@JoaoLeal, gorpacrate: Зачем давать случайные предложения? Это не помогает :(   -  person gkalpak    schedule 24.11.2014
comment
@David: Вы уверены, что CtrlA загружается до трансляции? Похоже, ваш код должен работать.   -  person gkalpak    schedule 24.11.2014
comment
Комментарий Жоао немного не по теме, однако прослушивание в локальной области имеет смысл, так как слушатель автоматически отменяет регистрацию при уничтожении области. В противном случае вам нужно сделать это вручную (только мои два цента по этой теме).   -  person Pavel Horal    schedule 24.11.2014
comment
@David Кажется, вы могли бы расширить область действия, добавив пару методов для управления связью pub/sub и сделать ваши контроллеры более слабо связанными. См. вторую часть этого ответа.   -  person PSL    schedule 29.11.2014
comment
ребята всем спасибо за помощь. кажется, что мой код действительно работает, просто я думал, что эта угловая трансляция будет работать на разных вкладках браузера. Это означает, что другая вкладка браузера может транслировать событие, а другая вкладка браузера будет его перехватывать, но похоже, что Angular так не работает. Нужно использовать window.postMessage.   -  person David    schedule 08.12.2014


Ответы (1)


Трудно ответить, не зная, что вы пробовали. См. этот plnkr: http://plnkr.co/edit/hYzWOrgEyPLlCMZnDCo2?p=preview

Я в основном создал два контроллера, один отправляет текст другому:

app.controller('CtrlA', function($scope, $rootScope) {
  $scope.submit = function(){
    $rootScope.$broadcast('userHasLoggedIn', $scope.input);
  }

});

app.controller('CtrlB', function($scope) {
  $scope.$on('userHasLoggedIn', function(event, data){
    $scope.data = data; 
  });

  $scope.data = 'nothing';
});
person Joao Leal    schedule 24.11.2014