Как я могу отправить свой объект $ scope с одного контроллера на другой, используя методы. $ Emit и. $ On?
Вы можете отправить любой объект в иерархии вашего приложения, включая $ scope .
Вот краткое представление о том, как транслировать и излучать работают .
Обратите внимание на узлы ниже; все они вложены в узел 3. Вы используете широковещательную рассылку и передачу при наличии этого сценария.
Примечание: номер каждого узла в этом примере является произвольным; это может легко быть номер один; номер два; или даже число 1348. Каждый номер является просто идентификатором для этого примера. Смысл этого примера - показать вложение угловых контроллеров / директив.
3
------------
| |
----- ------
1 | 2 |
--- --- --- ---
| | | | | | | |
Посмотри на это дерево. Как вы отвечаете на следующие вопросы?
Примечание: Есть другие способы , чтобы ответить на эти вопросы, но здесь мы будем обсуждать трансляцию и Emit . Кроме того, при чтении текста ниже предположим, что у каждого числа есть собственный файл (директива, контроллер), например, one.js, two.js, three.js.
Как узел 1 говорит с узлом 3 ?
В файле one.js
scope.$emit('messageOne', someValue(s));
В файле three.js - самый верхний узел для всех дочерних узлов, необходимых для связи.
scope.$on('messageOne', someValue(s));
Как узел 2 говорит с узлом 3?
В файле two.js
scope.$emit('messageTwo', someValue(s));
В файле three.js - самый верхний узел для всех дочерних узлов, необходимых для связи.
scope.$on('messageTwo', someValue(s));
Как узел 3 общается с узлом 1 и / или узлом 2?
В файле three.js - самый верхний узел для всех дочерних узлов, необходимых для связи.
scope.$broadcast('messageThree', someValue(s));
В файле one.js && two.js, в зависимости от того, какой файл вы хотите перехватить, или оба.
scope.$on('messageThree', someValue(s));
Как узел 2 говорит с узлом 1?
В файле two.js
scope.$emit('messageTwo', someValue(s));
В файле three.js - самый верхний узел для всех дочерних узлов, необходимых для связи.
scope.$on('messageTwo', function( event, data ){
scope.$broadcast( 'messageTwo', data );
});
В файле one.js
scope.$on('messageTwo', someValue(s));
ОДНАКО
Когда у вас есть все эти вложенные дочерние узлы, пытающиеся взаимодействовать таким образом, вы быстро увидите много $ on , $ broadcast и $ emit .
Вот что мне нравится делать.
В самом верхнем РОДИТЕЛЬСКОМ УЗЛЕ ( 3 в данном случае ...), который может быть вашим родительским контроллером ...
Итак, в файле three.js
scope.$on('pushChangesToAllNodes', function( event, message ){
scope.$broadcast( message.name, message.data );
});
Теперь в любом из дочерних узлов вам нужно всего лишь отправить сообщение или перехватить его, используя $ on .
ПРИМЕЧАНИЕ. Обычно довольно просто пересечь разговор по одному вложенному пути, не используя $ emit , $ broadcast или $ on , что означает, что большинство случаев использования - это когда вы пытаетесь заставить узел 1 взаимодействовать с узлом 2 или наоборот.
Как узел 2 говорит с узлом 1?
В файле two.js
scope.$emit('pushChangesToAllNodes', sendNewChanges());
function sendNewChanges(){ // for some event.
return { name: 'talkToOne', data: [1,2,3] };
}
В файле three.js - самый верхний узел для всех дочерних узлов, необходимых для связи.
Мы уже справились с этим помните?
В файле one.js
scope.$on('talkToOne', function( event, arrayOfNumbers ){
arrayOfNumbers.forEach(function(number){
console.log(number);
});
});
Вам все еще нужно будет использовать $ on для каждого конкретного значения, которое вы хотите перехватить, но теперь вы можете создавать все, что вам нравится, в любом из узлов, не беспокоясь о том, как передать сообщение через пробел родительского узла, когда мы ловим и транслируем универсальные pushChangesToAllNodes .
Надеюсь это поможет...
$rootScope
для трансляции / эмиссии, когда этого можно избежать.