Como posso enviar meu objeto $ scope de um controlador para outro usando os métodos. $ Emit e. $ Nos métodos?
Você pode enviar qualquer objeto que desejar dentro da hierarquia do seu aplicativo, incluindo $ scope .
Aqui está uma idéia rápida sobre como a transmissão e a emissão funcionam.
Observe os nós abaixo; tudo aninhado no nó 3. Você usa broadcast e emite quando possui esse cenário.
Nota: O número de cada nó neste exemplo é arbitrário; poderia facilmente ser o número um; o número dois; ou até o número 1.348. Cada número é apenas um identificador para este exemplo. O objetivo deste exemplo é mostrar o aninhamento de controladores / diretivas angulares.
3
------------
| |
----- ------
1 | 2 |
--- --- --- ---
| | | | | | | |
Confira esta árvore. Como você responde às seguintes perguntas?
Nota: Existem outras maneiras de responder a essas perguntas, mas aqui discutiremos transmissão e emissão . Além disso, ao ler o texto abaixo, assuma que cada número tem seu próprio arquivo (diretiva, controlador) ex one.js, two.js, three.js.
Como o nó 1 fala com o nó 3 ?
No arquivo one.js
scope.$emit('messageOne', someValue(s));
No arquivo three.js - o nó superior de todos os nós filhos necessários para se comunicar.
scope.$on('messageOne', someValue(s));
Como o nó 2 fala com o nó 3?
No arquivo two.js
scope.$emit('messageTwo', someValue(s));
No arquivo three.js - o nó superior de todos os nós filhos necessários para se comunicar.
scope.$on('messageTwo', someValue(s));
Como o nó 3 fala com o nó 1 e / ou o nó 2?
No arquivo three.js - o nó superior de todos os nós filhos necessários para se comunicar.
scope.$broadcast('messageThree', someValue(s));
No arquivo one.js && two.js, qualquer arquivo que você deseja capturar a mensagem ou ambos.
scope.$on('messageThree', someValue(s));
Como o nó 2 fala com o nó 1?
No arquivo two.js
scope.$emit('messageTwo', someValue(s));
No arquivo three.js - o nó superior de todos os nós filhos necessários para se comunicar.
scope.$on('messageTwo', function( event, data ){
scope.$broadcast( 'messageTwo', data );
});
No arquivo one.js
scope.$on('messageTwo', someValue(s));
CONTUDO
Quando você tem todos esses nós filhos aninhados tentando se comunicar assim, rapidamente verá muitos $ on , $ broadcast e $ emit .
Aqui está o que eu gosto de fazer.
No NÚMERO DE PAI mais alto ( 3 neste caso ...), que pode ser seu controlador pai ...
Então, no arquivo three.js
scope.$on('pushChangesToAllNodes', function( event, message ){
scope.$broadcast( message.name, message.data );
});
Agora, em qualquer um dos nós filhos, você só precisa emitir a mensagem $ ou capturá-la usando $ on .
NOTA: Normalmente, é bastante fácil cruzar a conversa em um caminho aninhado sem usar $ emit , $ broadcast ou $ on , o que significa que a maioria dos casos de uso é para quando você está tentando fazer o nó 1 se comunicar com o nó 2 ou vice-versa.
Como o nó 2 fala com o nó 1?
No arquivo two.js
scope.$emit('pushChangesToAllNodes', sendNewChanges());
function sendNewChanges(){ // for some event.
return { name: 'talkToOne', data: [1,2,3] };
}
No arquivo three.js - o nó superior de todos os nós filhos necessários para se comunicar.
Já lidamos com este, lembra?
No arquivo one.js
scope.$on('talkToOne', function( event, arrayOfNumbers ){
arrayOfNumbers.forEach(function(number){
console.log(number);
});
});
Você ainda precisará usar $ on com cada valor específico que deseja capturar, mas agora pode criar o que quiser em qualquer um dos nós sem ter que se preocupar em como transmitir a mensagem através da lacuna do nó pai à medida que capturamos e transmitimos o pushChangesToAllNodes genérico .
Espero que isto ajude...
$rootScope
para transmissão / emissão quando puder ser evitado.