Comment envoyer mon objet $ scope d'un contrôleur à un autre en utilisant les méthodes. $ Emit et. $ On?
Vous pouvez envoyer tout objet de votre choix dans la hiérarchie de votre application, y compris $ scope .
Voici une idée rapide sur la façon dont la diffusion et Emit travail.
Remarquez les nœuds ci-dessous; tous imbriqués dans le nœud 3. Vous utilisez la diffusion et émettez lorsque vous avez ce scénario.
Remarque: Le nombre de chaque nœud dans cet exemple est arbitraire; ce pourrait facilement être le numéro un; le numéro deux; ou même le nombre 1.348. Chaque numéro n'est qu'un identifiant pour cet exemple. Le but de cet exemple est de montrer l'imbrication des contrôleurs / directives angulaires.
3
------------
| |
----- ------
1 | 2 |
--- --- --- ---
| | | | | | | |
Découvrez cet arbre. Comment répondez-vous aux questions suivantes?
Note: Il y a d' autres façons de répondre à ces questions, mais ici , nous allons discuter de diffusion et Emit . De plus, lors de la lecture du texte ci-dessous, supposez que chaque numéro a son propre fichier (directive, contrôleur) ex one.js, two.js, three.js.
Comment le nœud 1 parle-t-il au nœud 3 ?
Dans le fichier one.js
scope.$emit('messageOne', someValue(s));
Dans le fichier three.js - le nœud le plus élevé de tous les nœuds enfants nécessaires pour communiquer.
scope.$on('messageOne', someValue(s));
Comment le nœud 2 parle-t-il au nœud 3?
Dans le fichier two.js
scope.$emit('messageTwo', someValue(s));
Dans le fichier three.js - le nœud le plus élevé de tous les nœuds enfants nécessaires pour communiquer.
scope.$on('messageTwo', someValue(s));
Comment le nœud 3 parle-t-il au nœud 1 et / ou au nœud 2?
Dans le fichier three.js - le nœud le plus élevé de tous les nœuds enfants nécessaires pour communiquer.
scope.$broadcast('messageThree', someValue(s));
Dans le fichier one.js && two.js, quel fichier vous voulez attraper le message ou les deux.
scope.$on('messageThree', someValue(s));
Comment le nœud 2 parle-t-il au nœud 1?
Dans le fichier two.js
scope.$emit('messageTwo', someValue(s));
Dans le fichier three.js - le nœud le plus élevé de tous les nœuds enfants nécessaires pour communiquer.
scope.$on('messageTwo', function( event, data ){
scope.$broadcast( 'messageTwo', data );
});
Dans le fichier one.js
scope.$on('messageTwo', someValue(s));
TOUTEFOIS
Lorsque tous ces nœuds enfants imbriqués essaient de communiquer comme cela, vous verrez rapidement de nombreux $ on , $ broadcast et $ emit .
Voici ce que j'aime faire.
Dans le NŒUD PARENT supérieur ( 3 dans ce cas ...), qui peut être votre contrôleur parent ...
Donc, dans le fichier three.js
scope.$on('pushChangesToAllNodes', function( event, message ){
scope.$broadcast( message.name, message.data );
});
Maintenant, dans n'importe lequel des nœuds enfants, il vous suffit d' émettre $ le message ou de l'attraper en utilisant $ on .
REMARQUE: Il est normalement assez facile de traverser une conversation dans un chemin imbriqué sans utiliser $ emit , $ broadcast ou $ on , ce qui signifie que la plupart des cas d'utilisation sont lorsque vous essayez de faire communiquer le nœud 1 avec le nœud 2 ou vice versa.
Comment le nœud 2 parle-t-il au nœud 1?
Dans le fichier two.js
scope.$emit('pushChangesToAllNodes', sendNewChanges());
function sendNewChanges(){ // for some event.
return { name: 'talkToOne', data: [1,2,3] };
}
Dans le fichier three.js - le nœud le plus élevé de tous les nœuds enfants nécessaires pour communiquer.
Nous avons déjà traité celui-ci, vous vous en souvenez?
Dans le fichier one.js
scope.$on('talkToOne', function( event, arrayOfNumbers ){
arrayOfNumbers.forEach(function(number){
console.log(number);
});
});
Vous devrez toujours utiliser $ on avec chaque valeur spécifique que vous souhaitez attraper, mais maintenant vous pouvez créer ce que vous voulez dans l'un des nœuds sans avoir à vous soucier de la façon de faire passer le message à travers l'écart du nœud parent pendant que nous interceptons et diffusons le pushChangesToAllNodes générique .
J'espère que cela t'aides...
$rootScope
pour la diffusion / émission quand cela peut être évité.