Des Événements mondiaux Angulaire
N'est-il pas équivalent à $scope.emit()
ou $scope.broadcast()
Angulaire?
Je sais que le EventEmitter
de fonctionnalités, mais autant je comprends que va juste émettre un événement pour le parent de l'élément HTML.
Que faire si j'ai besoin de communiquer entre fx. les frères et sœurs ou entre un composant dans la racine de la DOM et un élément imbriqué plusieurs niveaux de profondeur?
- J'ai eu une question similaire, lié à la création d'une boîte de dialogue composant qui peut être consulté à partir de n'importe quel point dans les dom: stackoverflow.com/questions/34572539/... Fondamentalement, la seule solution est de mettre un événement à l'émetteur d'un service
- Voici ma mise en œuvre d'un tel service à l'aide de RXJS qui permet d'obtenir la nième dernières valeurs lors de la souscription. stackoverflow.com/questions/46027693/...
Vous devez vous connecter pour publier un commentaire.
Il n'y a pas d'équivalent à
$scope.emit()
ou$scope.broadcast()
d'AngularJS.EventEmitter à l'intérieur d'un composant est proche, mais comme vous l'avez mentionné, il n'émettent qu'un événement pour le parent immédiat composant.
Angulaire, il existe d'autres alternatives qui je vais essayer de l'expliquer ci-dessous.
@Input() liaisons permet l'application du modèle à être connecté à une orientée objet graphique (de la racine vers les feuilles). Le comportement par défaut d'un composant détecteur de changement de stratégie est de propager toutes les modifications apportées à un modèle d'application pour toutes les liaisons à partir de tout appareil connecté.
De côté: Il y a deux types de modèles: les Modèles de Vue et des Modèles d'Application. Un modèle d'application est connecté via @Input() liaisons. Un modèle de vue est juste une propriété d'un composant (non décorée avec @Input()) qui est lié à la composante du modèle.
Pour répondre à vos questions:
Que faire si j'ai besoin de communiquer entre frère composants?
Partagé De L'Application Du Modèle:
Les frères et sœurs peuvent communiquer grâce au partage d'un modèle d'application (tout comme angulaire 1). Par exemple, quand un enfant fait un changement pour un modèle, une autre sœur qui a les fixations pour le même modèle est mis à jour automatiquement.
Les Événements du composant de l'Enfant: les composants peuvent émettre un événement pour le composant parent à l'aide de @Output() liaisons. Le composant parent peut gérer l'événement, et de manipuler le modèle d'application ou de son propre modèle de vue. Des modifications à l'Application du Modèle sont automatiquement propagées à tous les composants qui, directement ou indirectement lier le même modèle.
Événements de Service: les Composants peuvent s'abonner à des événements de service. Par exemple, deux frère les composants peuvent s'abonner au service même de l'événement et d'y répondre par la modification de leurs modèles respectifs. En savoir plus sur ce ci-dessous.
Comment puis-je communiquer entre un composant Racine et un élément imbriqué plusieurs niveaux de profondeur?
$scope.broadcast()
Angulaires 1. La section suivante décrit cette idée plus en détail.Exemple d'une Observable Service qui utilise les Événements de Service pour Propager les Modifications
Voici un exemple d'une observable service qui utilise les événements de service pour propager les modifications. Quand un TodoItem est ajouté, le service émet un événement de la notification de ses composants abonnés.
Ici est de savoir comment un composant racine serait de vous inscrire à l'événement:
Un composant enfant imbriquées à plusieurs niveaux de profondeur serait de vous inscrire à l'événement de la même façon:
Ici est le composant qui appelle le service pour déclencher l'événement (il peut se trouver n'importe où dans le volet de l'arborescence):
Référence: La Détection de changement dans Angulaire
itemAdded$
. Est-ce un RxJS convention ou quelque chose? D'où vient-il?street
propriété de l'application du modèle, mais depuis Angulaire 2 met en œuvre la détection de changement d'identité/de référence, pas de modifications sont propagées (onChanges
n'est pas appelé), car l'application du modèle de référence n'a pas changé (suite...)ngOnChanges()
n'est pas appelée si seulement une partie de la propriété est modifiée.ngOnChanges()
être appelé, mais l'évolution de l'application du modèle de référence, par la création d'un nouvel objet, entraînengOnChanges()
d'être appelé. (Avoir la console pour voir les messages de log.) Je pense qu'il est important de souligner que si un modèle d'application valeur de la propriété changengOnChanges()
n'est pas appelé. Pour moi, ce qui signifie pas de propagation de l'... mais le modèle de liaisons de toujours être à nouveau évalués. Je vais arrêter maintenant 🙂Although the Angular framework does not enforce a naming convention for observables, you will often see observables named with a trailing “$” sign.
Le code suivant comme un exemple de remplacement pour $champ d'application.emit() ou $champ d'application.diffusion() Angulaire 2 à l'aide d'un de services partagés pour gérer les événements.
Exemple d'utilisation:
Diffusion:
Auditeur:
Il peut prendre en charge plusieurs arguments:
EventsService
de la classe peut travailler en tant que gestionnaire d'événement global sans l'aide deRxJS
à tous, donc, quel est l'avantage ici?off(name, listener) { this.listeners[name] = this.listeners[name].filter(x => x != listener); }
Je suis en utilisant un service de messagerie qui encapsule une rxjs
Subject
(Tapuscrit)Plunker exemple: Message de Service
Composants abonnez-vous et les événements de diffusion (expéditeur):
(récepteur)
La
subscribe
méthode deMessageService
retourne un rxjsSubscription
objet, qui peut être désabonné de la sorte:Aussi voir cette réponse: https://stackoverflow.com/a/36782616/1861779
Plunker exemple: Message de Service
Property 'filter' does not exist on type 'Subject<EventMessage>'.
this.handler.pipe(filter(...))
. Voir locative opérateurs.return this.handler.pipe( filter(message => message.type === type), map(message => message.payload) ).subscribe(callback);
NE Pas Utiliser EventEmitter pour votre service de communication.
Vous devez utiliser l'un des Observables types. Personnellement, j'aime BehaviorSubject.
Exemple Simple:
Vous pouvez passer de l'état initial, ici j'en passant null
Lorsque vous souhaitez mettre à jour le sujet
Observer à partir de n'importe quel service ou de composant et d'agir lorsqu'il obtient de nouvelles mises à jour.
Voici de plus amples informations..
Vous pouvez utiliser
EventEmitter ouobservables pour créer un eventbus service que vous vous inscrivez avec DI. Tous les composants qui veut participer seulement les demandes de service en tant que paramètre du constructeur et émet et/ou s'abonne aux événements.Voir aussi
Ma façon préférée de le faire est en utilisant le comportement de l'objet ou de l'événement de l'émetteur (presque la même) dans mon service pour le contrôle de tous mes sous-composant.
Angulaire à l'aide de la cli, exécutez ng g s pour créer un nouveau service, puis utilisez un BehaviorSubject ou EventEmitter
Lorsque vous n'avez que chaque composant à l'aide de votre service en tant que fournisseur sera informé du changement. Il suffit de vous abonner à la suite, comme vous le faites avec eventEmitter 😉
J'ai créé un pub-sous-échantillon ici:
http://www.syntaxsuccess.com/viewarticle/pub-sub-in-angular-2.0
L'idée est d'utiliser RxJs Sujets de fil d'un Observateur et et Observables comme une solution générique pour l'émission et à la souscription à des événements personnalisés. Dans mon exemple j'utilise un client de l'objet à des fins de démonstration
Voici une démo en live ainsi:
http://www.syntaxsuccess.com/angular-2-samples/#/demo/pub-sub
C'est ma version:
utilisation:
}
émettent:
Nous avons mis en place un ngModelChange observables directive qui envoie tous les changements dans le modèle par le biais d'un événement de l'émetteur que vous instanciez dans votre propre composant. Il vous suffit de lier votre événement émetteur de la directive.
Voir: https://github.com/atomicbits/angular2-modelchangeobservable
En html, lier votre événement émetteur (countryChanged dans cet exemple):
Dans votre fichier d'enregistrement de composant, de faire des opérations asynchrones sur le EventEmitter:
Événements de Service: les Composants peuvent s'abonner à des événements de service. Par exemple, deux frère les composants peuvent s'abonner au service même de l'événement et d'y répondre par la modification de leurs modèles respectifs. En savoir plus sur ce ci-dessous.
Mais assurez-vous de vous désabonner à détruire le composant parent.
Une autre façon de communiquer entre les composants et services est avec les Événements fournisseur utilisé dans Ionique.
Je préfère le "publier" et "s'abonner" synthax, plus lisible à mon avis.
Il suffit de copier ce service à vos Angulaire du projet.
Plus d'informations sur Ionique Événements: Ionique Événements Doc