¿Cómo puedo enviar mi objeto $ scope de un controlador a otro usando los métodos. $ Emit y. $ On?
Puede enviar cualquier objeto que desee dentro de la jerarquía de su aplicación, incluido $ scope .
He aquí una idea rápida de cómo difusión y emiten trabajo.
Observe los nodos a continuación; todos anidados dentro del nodo 3. Usas broadcast y emites cuando tienes este escenario.
Nota: El número de cada nodo en este ejemplo es arbitrario; fácilmente podría ser el número uno; el numero dos; o incluso el número 1,348. Cada número es solo un identificador para este ejemplo. El objetivo de este ejemplo es mostrar el anidamiento de controladores / directivas angulares.
3
------------
| |
----- ------
1 | 2 |
--- --- --- ---
| | | | | | | |
Mira este árbol ¿Cómo responde las siguientes preguntas?
Nota: Hay otras maneras de responder a estas preguntas, pero aquí vamos a discutir emisión y emiten . Además, cuando lea el texto a continuación, suponga que cada número tiene su propio archivo (directiva, controlador) ex one.js, two.js, three.js.
¿Cómo habla el nodo 1 al nodo 3 ?
En el archivo one.js
scope.$emit('messageOne', someValue(s));
En el archivo three.js : el nodo superior para todos los nodos secundarios necesarios para comunicarse.
scope.$on('messageOne', someValue(s));
¿Cómo habla el nodo 2 al nodo 3?
En el archivo two.js
scope.$emit('messageTwo', someValue(s));
En el archivo three.js : el nodo superior para todos los nodos secundarios necesarios para comunicarse.
scope.$on('messageTwo', someValue(s));
¿Cómo habla el nodo 3 al nodo 1 y / o al nodo 2?
En el archivo three.js : el nodo superior para todos los nodos secundarios necesarios para comunicarse.
scope.$broadcast('messageThree', someValue(s));
En el archivo one.js && two.js, el archivo que desee capturar el mensaje o ambos.
scope.$on('messageThree', someValue(s));
¿Cómo habla el nodo 2 al nodo 1?
En el archivo two.js
scope.$emit('messageTwo', someValue(s));
En el archivo three.js : el nodo superior para todos los nodos secundarios necesarios para comunicarse.
scope.$on('messageTwo', function( event, data ){
scope.$broadcast( 'messageTwo', data );
});
En el archivo one.js
scope.$on('messageTwo', someValue(s));
SIN EMBARGO
Cuando tenga todos estos nodos hijos anidados que intentan comunicarse de esta manera, verá rápidamente muchos $ on , $ broadcast's y $ emit's .
Esto es lo que me gusta hacer.
En el NODO DE PADRES superior ( 3 en este caso ...), que puede ser su controlador principal ...
Entonces, en el archivo three.js
scope.$on('pushChangesToAllNodes', function( event, message ){
scope.$broadcast( message.name, message.data );
});
Ahora en cualquiera de los nodos secundarios solo necesita $ emitir el mensaje o atraparlo usando $ on .
NOTA: Normalmente es bastante fácil cruzar la conversación en una ruta anidada sin usar $ emit , $ broadcast o $ on , lo que significa que la mayoría de los casos de uso son cuando intenta que el nodo 1 se comunique con el nodo 2 o viceversa.
¿Cómo habla el nodo 2 al nodo 1?
En el archivo two.js
scope.$emit('pushChangesToAllNodes', sendNewChanges());
function sendNewChanges(){ // for some event.
return { name: 'talkToOne', data: [1,2,3] };
}
En el archivo three.js : el nodo superior para todos los nodos secundarios necesarios para comunicarse.
Ya manejamos este, ¿recuerdas?
En el archivo one.js
scope.$on('talkToOne', function( event, arrayOfNumbers ){
arrayOfNumbers.forEach(function(number){
console.log(number);
});
});
Aún necesitará usar $ on con cada valor específico que desee capturar, pero ahora puede crear lo que quiera en cualquiera de los nodos sin tener que preocuparse por cómo transmitir el mensaje a través del espacio del nodo principal a medida que capturamos y transmitimos el genérico pushChangesToAllNodes .
Espero que esto ayude...
$rootScope
para transmitir / emitir cuando se pueda evitar.