Как использовать $emit и $on angularjs для двух разных контроллеров, хранящихся по разным путям

У меня есть два представления и его соответствующий контроллер. Скажем, view1.html и его контроллер firstCntrl и view2.html и его контроллер secndCntrl.

В view1.html:

Существует Link2, который будет перенаправлен на view2.html, если на него щелкнуть.

<a href="#/view1" ng-click="emit()">Link1</a>  
<a href="#/view2" ng-click="emit()">Link2</a>

в ng-click я вызываю функцию emit, где я определил $emit как firstCntrl.js

 app.controller("firstCntrl", function ($scope) {
    $scope.emit = function() {
      $scope.$emit('send', { message: 'true' });
    };
 });

Я хочу отправить истину отсюда и поймать ее в $on.

В view2.html

Есть два дива. скажем, div one и div two.

<div ng-show="one">Hello</div>
<div ng-show="two">World</div>

Что я хочу, чтобы если пользователь нажимал на первую ссылку, он должен отображать первый div view2.html

Or

если пользователь нажимает на вторую ссылку, тогда он должен показывать сенкод div view2.html. Два представления имеют свой собственный второй контроллер. Я поражен здесь. Помогите мне в этом Как это сделать. Благодарим вас заранее.


person Mohammed    schedule 14.01.2017    source источник


Ответы (1)


Я думаю, вам не нужно здесь излучать, так как firstCtrl и secondCtrl — это отдельные контроллеры. Если между вашими областями нет отношения родитель-потомок, вы можете ввести $rootScope в контроллер и передать событие всем дочерним областям.

View1.html

<a href="#/view1" ng-click="broadcastMsg(1)">Link1</a>  
<a href="#/view2" ng-click="broadcastMsg(2)">Link2</a>

первыйCtrl

app.controller("firstCntrl", function ($scope, $rootScope) {
    $scope.broadcastMsg = function(id) {
      if (id == 1) 
          $rootScope.$broadcast('send', 'One');
      else 
          $rootScope.$broadcast('send', 'Two');
    };
 });

View2.html

<div ng-show="showOne">Hello</div>
<div ng-show="!showOne">World</div>

родительский_управление

Используйте $scope.on вместо $rootScope.on, чтобы предотвратить утечку памяти.

app.controller("parentCntrl", function ($scope, $rootScope) {
      $scope.$on('send', function (evt, message) {
            if (message == 'One') 
                $scope.showOne = true;
            else
                $scope.showOne = false;
      });
 });

второйCtrl

app.controller("secondCntrl", function ($scope) {
      $scope.showOne = $scope.$parent.showOne;
 });
person digit    schedule 14.01.2017
comment
я заметил одну вещь: если я нажимаю на msg1 или msg 2, но он показывает только World. нет привет - person Mohammed; 14.01.2017
comment
Я столкнулся с одной ошибкой: $broadcast не работает с одним щелчком мыши. Я должен щелкнуть два раза для этого. @цифра - person Mohammed; 16.01.2017
comment
Это не баг я думаю. Это задержка исполнения. Можете ли вы отладить код, поместив console.log('enter') в rootscope.on. Что вы получите после первого нажатия? - person digit; 16.01.2017
comment
Нет. Я получаю это после того, как нажму на нее во второй раз @digit - person Mohammed; 16.01.2017
comment
Я поместил свою трансляцию $ в конец контроллера. Так что в основном происходит то, что когда $broadcast запускается, он перенаправляется на запуск контроллера. Ответ при втором щелчке ищет $on - person Mohammed; 16.01.2017
comment
У вас есть родительский контроллер? - person digit; 16.01.2017
comment
да, мой контроллер заголовка - это домашний контроллер, и он включен через ng-include в другое представление @digit - person Mohammed; 16.01.2017
comment
Попробуйте поместить rootscope.on в родительский контроллер. - person digit; 16.01.2017
comment
он перестанет работать, если я использую $rootScope.$on @digit - person Mohammed; 16.01.2017
comment
Я знаю, что проблема в том. Я предполагаю, что другой контроллер, который должен получать событие, еще не установлен, когда вы $транслируете событие. - person digit; 16.01.2017
comment
поместите rootscope.on в родительский контроллер. Позвольте мне обновить мой ответ - person digit; 16.01.2017
comment
Я реализовал это. frstCntrl — это мой родительский контроллер, поэтому я разместил $broadcast и $on на одном контроллере, а во втором контроллере я пишу последний блок кода, который вы редактировали вчера. Но с помощью этого метода представление не загружается, хотя URL-адрес меняется. - person Mohammed; 17.01.2017