Come posso inviare il mio oggetto $ scope da un controller a un altro usando i metodi. $ Emit e. $ On?
Puoi inviare qualsiasi oggetto desiderato all'interno della gerarchia della tua app, incluso $ scope .
Ecco una rapida idea di come funzionano la trasmissione e l' emissione .
Notare i nodi seguenti; tutti nidificati all'interno del nodo 3. Si utilizza broadcast ed emette quando si ha questo scenario.
Nota: il numero di ciascun nodo in questo esempio è arbitrario; potrebbe essere facilmente il numero uno; il numero due; o anche il numero 1.348. Ogni numero è solo un identificatore per questo esempio. Il punto di questo esempio è mostrare l'annidamento di controller / direttive angolari.
3
------------
| |
----- ------
1 | 2 |
--- --- --- ---
| | | | | | | |
Dai un'occhiata a questo albero. Come rispondete alle seguenti domande?
Nota: Ci sono altri modi per rispondere a queste domande, ma qui parleremo di trasmissione e Emit . Inoltre, quando leggi il testo sotto, supponi che ogni numero abbia il suo file (direttiva, controller) ex one.js, two.js, three.js.
In che modo il nodo 1 parla al nodo 3 ?
Nel file one.js
scope.$emit('messageOne', someValue(s));
Nel file three.js : il nodo più in alto di tutti i nodi figlio necessari per comunicare.
scope.$on('messageOne', someValue(s));
In che modo il nodo 2 parla al nodo 3?
Nel file two.js
scope.$emit('messageTwo', someValue(s));
Nel file three.js : il nodo più in alto di tutti i nodi figlio necessari per comunicare.
scope.$on('messageTwo', someValue(s));
In che modo il nodo 3 parla al nodo 1 e / o al nodo 2?
Nel file three.js : il nodo più in alto di tutti i nodi figlio necessari per comunicare.
scope.$broadcast('messageThree', someValue(s));
Nel file one.js && two.js qualunque file si desideri catturare il messaggio o entrambi.
scope.$on('messageThree', someValue(s));
In che modo il nodo 2 parla al nodo 1?
Nel file two.js
scope.$emit('messageTwo', someValue(s));
Nel file three.js : il nodo più in alto di tutti i nodi figlio necessari per comunicare.
scope.$on('messageTwo', function( event, data ){
scope.$broadcast( 'messageTwo', data );
});
Nel file one.js
scope.$on('messageTwo', someValue(s));
PERÒ
Quando hai tutti questi nodi figlio nidificati che provano a comunicare in questo modo, vedrai rapidamente molti $ on , $ broadcast e $ emit .
Ecco cosa mi piace fare.
Nel NODO GENITORE superiore ( 3 in questo caso ...), che potrebbe essere il tuo controllore principale ...
Quindi, nel file three.js
scope.$on('pushChangesToAllNodes', function( event, message ){
scope.$broadcast( message.name, message.data );
});
Ora in qualsiasi nodo figlio devi solo $ emettere il messaggio o prenderlo usando $ on .
NOTA: Normalmente è abbastanza facile incrociare le conversazioni in un percorso nidificato senza usare $ emit , $ broadcast o $ on , il che significa che la maggior parte dei casi d'uso è quando si sta tentando di ottenere il nodo 1 per comunicare con il nodo 2 o viceversa.
In che modo il nodo 2 parla al nodo 1?
Nel file two.js
scope.$emit('pushChangesToAllNodes', sendNewChanges());
function sendNewChanges(){ // for some event.
return { name: 'talkToOne', data: [1,2,3] };
}
Nel file three.js : il nodo più in alto di tutti i nodi figlio necessari per comunicare.
Abbiamo già gestito questo ricordi?
Nel file one.js
scope.$on('talkToOne', function( event, arrayOfNumbers ){
arrayOfNumbers.forEach(function(number){
console.log(number);
});
});
Dovrai comunque usare $ su con ogni valore specifico che vuoi catturare, ma ora puoi creare quello che ti piace in uno dei nodi senza doversi preoccupare di come far passare il messaggio attraverso il gap del nodo genitore mentre catturiamo e trasmettiamo i pushChangesToAllNodes generici .
Spero che sia di aiuto...
$rootScope
per trasmettere / emettere quando può essere evitato.