Comment envoyer mon $scope
objet d'un contrôleur à un autre à l'aide des méthodes .$emit
et .$on
?
function firstCtrl($scope) {
$scope.$emit('someEvent', [1,2,3]);
}
function secondCtrl($scope) {
$scope.$on('someEvent', function(mass) { console.log(mass); });
}
Cela ne fonctionne pas comme je le pense. Comment ça marche $emit
et comment $on
?
javascript
angularjs
Paul Kononenko
la source
la source
$rootScope
pour la diffusion / émission quand cela peut être évité.Réponses:
Tout d'abord, la relation de portée parent-enfant est importante. Vous avez deux possibilités pour émettre un événement:
$broadcast
- envoie l'événement vers le bas à tous les enfants,$emit
- distribue l'événement vers le haut à travers la hiérarchie de portée.Je ne sais rien de la relation entre vos contrôleurs (étendues), mais il existe plusieurs options:
Si la portée de
firstCtrl
est parent de lasecondCtrl
portée, votre code devrait fonctionner en remplaçant$emit
par$broadcast
dansfirstCtrl
:Dans le cas où il n'y a pas de relation parent-enfant entre vos étendues, vous pouvez injecter
$rootScope
dans le contrôleur et diffuser l'événement à toutes les étendues enfants (c'est-à-dire égalementsecondCtrl
).Enfin, lorsque vous devez répartir l'événement du contrôleur enfant vers des étendues vers le haut, vous pouvez l'utiliser
$scope.$emit
. Si l'étendue defirstCtrl
est parent de l'secondCtrl
étendue:la source
$rootScope
dans votre service et diffuser l'événement à partir du service.$rootScope
- mais je veux savoir que si j'émets un événement à partir d'un service (hors de$rootScope
), l'événement continuera de percoler$rootScope
; PARCE QUE, si$broadcast
percole vers le BAS de la hiérarchie, et vers le$emit
haut - ce qui se passe entre "UP" et "DOWN" - puisque le diffuseur / émetteur est également l'auditeur (?). Que se passe-t-il si je veux que l'événement soit silencieux sur TOUTES les portées "UPWARD" et TOUS "DOWNWARD", mais seulement "audible" au même niveau que le répartiteur?Je suggérerais en outre une 4ème option comme meilleure alternative aux options proposées par @zbynour.
Utilisez
$rootScope.$emit
plutôt$rootScope.$broadcast
qu'indépendamment de la relation entre le transmetteur et le contrôleur récepteur. De cette façon, l'événement reste dans l'ensemble de$rootScope.$$listeners
tandis qu'avec$rootScope.$broadcast
l'événement se propage à tous les enfants, les portées, dont la plupart ne seront probablement pas à l'écoute de cet événement de toute façon. Et bien sûr, du côté du contrôleur récepteur que vous utilisez$rootScope.$on
.Pour cette option, vous devez vous rappeler de détruire les écouteurs rootScope du contrôleur:
la source
$rootScope
injection dans les contrôleurs (ce qui n'est pas nécessaire en général). Mais sûrement une autre option, merci!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.
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
Dans le fichier three.js - le nœud le plus élevé de tous les nœuds enfants nécessaires pour communiquer.
Comment le nœud 2 parle-t-il au nœud 3?
Dans le fichier two.js
Dans le fichier three.js - le nœud le plus élevé de tous les nœuds enfants nécessaires pour communiquer.
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.
Dans le fichier one.js && two.js, quel fichier vous voulez attraper le message ou les deux.
Comment le nœud 2 parle-t-il au nœud 1?
Dans le fichier two.js
Dans le fichier three.js - le nœud le plus élevé de tous les nœuds enfants nécessaires pour communiquer.
Dans le fichier one.js
TOUTEFOIS
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
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
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
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...
la source
The event life cycle starts at the scope on which $broadcast was called. All listeners listening for name event on this scope get notified.
vous obtiendrez (comme moi) une boucle infinie si vous implémentez ctrl1 en parlant à ctrl2 avec$on('x', function(e, data) { $broadcast('x', data) })
on ctrl3. Vous aurez besoin de ces lignes avant de diffuser;if (e.targetScope.$id === $scope.$id) { return; }
Pour envoyer
$scope object
d'un contrôleur à un autre, je vais discuter de$rootScope.$broadcast
et$rootScope.$emit
ici car ils sont les plus utilisés.Cas 1 :
$ rootScope. $ broadcast: -
$rootScope
l'auditeur n'est pas détruit automatiquement. Vous devez le détruire en utilisant$destroy
. Il est préférable de l'utiliser$scope.$on
car les écouteurs$scope
sont détruits automatiquement, c'est-à-dire dès que $ scope est détruit.Ou,
Cas 2:
$ rootScope. $ emit:
La principale différence entre $ emit et $ broadcast est que l'événement $ rootScope. $ Emit doit être écouté à l'aide de $ rootScope. $ On, car l'événement émis ne descend jamais via l'arborescence de la portée. .
Dans ce cas également, vous devez détruire l'auditeur comme dans le cas de $ broadcast.
Éditer:
Modifier 2 :
la source
Vous devez utiliser $ rootScope pour envoyer et capturer des événements entre des contrôleurs dans la même application. Injectez la dépendance $ rootScope à vos contrôleurs. Voici un exemple de travail.
Les événements liés à l'objet $ scope fonctionnent simplement dans le contrôleur propriétaire. La communication entre les contrôleurs se fait via $ rootScope ou Services.
la source
Vous pouvez appeler un service de votre contrôleur qui renvoie une promesse, puis l'utiliser dans votre contrôleur. Et utilisez-le
$emit
ou$broadcast
pour en informer d'autres contrôleurs. Dans mon cas, j'ai dû passer des appels http via mon service, j'ai donc fait quelque chose comme ceci:et mon service ressemble à ceci
la source
C'est ma fonction:
la source
la source
Les étendues peuvent être utilisées pour propager, distribuer un événement aux enfants de l'étendue ou au parent.
$ emit - propage l'événement au parent. $ broadcast - propage l'événement aux enfants. $ on - méthode pour écouter les événements, propagée par $ emit et $ broadcast.
exemple index.html :
exemple app.js :
Ici, vous pouvez tester le code: http://jsfiddle.net/zp6v0rut/41/
la source
Le code ci-dessous montre les deux sous-contrôleurs d'où les événements sont envoyés vers le haut vers le contrôleur parent (rootScope)
http://jsfiddle.net/shushanthp/zp6v0rut/
la source
Selon les documents d'événement angularjs, l'extrémité de réception devrait contenir des arguments avec une structure comme
@params
- {Object} événement étant l'objet événement contenant des informations sur l'événement
- Arguments {Object} qui sont passés par l'appelé (Notez que cela ne peut être que si il est préférable d'envoyer toujours un objet dictionnaire)
$scope.$on('fooEvent', function (event, args) { console.log(args) });
De votre codeDe plus, si vous essayez d'obtenir une information partagée pour être disponible sur différents contrôleurs, il existe un autre moyen d'y parvenir, à savoir les services angulaires. définir des fonctions dans ce service, exposer ces fonctions, créer des variables globales dans le service et les utiliser pour stocker les informations
la source
La manière la plus simple:
la source