J'ai un ListComponent. Lorsqu'un élément est cliqué dans ListComponent, les détails de cet élément doivent être affichés dans DetailComponent. Les deux sont à l'écran en même temps, il n'y a donc pas de routage impliqué.
Comment puis-je dire à DetailComponent quel élément de ListComponent a été cliqué?
J'ai envisagé d'émettre un événement jusqu'au parent (AppComponent) et j'ai demandé au parent de définir selectedItem.id sur DetailComponent avec un @Input. Ou je pourrais utiliser un service partagé avec des abonnements observables.
EDIT: La définition de l'élément sélectionné via event + @Input ne déclenche pas le DetailComponent, cependant, au cas où je devrais exécuter du code supplémentaire. Je ne suis donc pas sûr que ce soit une solution acceptable.
Mais ces deux méthodes semblent beaucoup plus complexes que la manière angulaire 1 de faire les choses qui était soit via $ rootScope. $ Broadcast ou $ scope. $ Parent. $ Broadcast.
Tout dans Angular 2 étant un composant, je suis surpris qu'il n'y ait pas plus d'informations sur la communication des composants.
Existe-t-il un autre moyen / plus simple d'accomplir cela?
la source
Réponses:
Mise à jour vers rc.4: lorsque vous essayez de faire passer des données entre des composants frères dans angular 2, le moyen le plus simple à l'heure actuelle (angular.rc.4) est de tirer parti de l'injection de dépendances hiérarchiques d'angular2 et de créer un service partagé.
Voici le service:
Maintenant, voici le composant PARENT
et ses deux enfants
enfant 1
enfant 2 (c'est frère)
MAINTENANT: Points à prendre en compte lors de l'utilisation de cette méthode.
la source
directives
ne sont plus déclarées dans le composant.Dans le cas de 2 composants différents (composants non imbriqués, parent \ enfant \ petit-enfant) je vous suggère ceci:
la source
Une façon de procéder consiste à utiliser un service partagé .
Cependant, je trouve la solution suivante beaucoup plus simple, elle permet de partager des données entre 2 frères et sœurs (je l'ai testé uniquement sur Angular 5 )
Dans votre modèle de composant parent:
app-sibling2.component.ts
la source
Il y a une discussion à ce sujet ici.
https://github.com/angular/angular.io/issues/2663
La réponse d'Alex J est bonne, mais elle ne fonctionne plus avec Angular 4 actuel à partir de juillet 2017.
Et ce lien plunker montrerait comment communiquer entre frères et sœurs en utilisant un service partagé et observable.
https://embed.plnkr.co/P8xCEwSKgcOg07pwDrlO/
la source
Une directive peut avoir un sens dans certaines situations pour «connecter» des composants. En fait, les éléments connectés n'ont même pas besoin d'être des composants complets, et parfois c'est plus léger et en fait plus simple s'ils ne le sont pas.
Par exemple, j'ai un
Youtube Player
composant (enveloppant l'API Youtube) et je voulais des boutons de contrôleur pour cela. La seule raison pour laquelle les boutons ne font pas partie de mon composant principal est qu'ils sont situés ailleurs dans le DOM.Dans ce cas, il s'agit en réalité d'un composant «extension» qui ne sera jamais utilisé qu'avec le composant «parent». Je dis «parent», mais dans le DOM, c'est un frère - alors appelez-le comme vous voulez.
Comme je l'ai dit, il n'est même pas nécessaire que ce soit un composant complet, dans mon cas, c'est juste un
<button>
(mais cela pourrait être un composant).Dans le HTML pour
ProductPage.component
, oùyoutube-player
est évidemment mon composant qui encapsule l'API Youtube.La directive relie tout pour moi, et je n'ai pas à déclarer l'événement (click) dans le HTML.
Ainsi, la directive peut bien se connecter au lecteur vidéo sans avoir à s'impliquer en
ProductPage
tant que médiateur.C'est la première fois que je fais cela, donc je ne sais pas encore à quel point cela pourrait être évolutif pour des situations beaucoup plus complexes. Pour cela, je suis heureux et cela laisse mon HTML simple et les responsabilités de tout distinctes.
la source
player
. Si je laisse de côté la première mention du joueur, j'obtiens une rangeError. Je suis perplexe quant à la façon dont cela est censé fonctionner._player
pour le champ privé qui représente le joueur, donc oui, vous obtiendrez une erreur si vous copiez cela exactement. Mettra à jour. Désolé!Voici une explication pratique simple: Simplement expliqué ici
Dans call.service.ts
Composant à partir duquel vous souhaitez appeler observable pour informer un autre composant que le bouton a été cliqué
Composant sur lequel vous souhaitez effectuer une action sur le bouton cliqué sur un autre composant
Ma compréhension claire de la communication des composants en lisant ceci: http://musttoknow.com/angular-4-angular-5-communicate-two-components-using-observable-subject/
la source
Le service partagé est une bonne solution à ce problème. Si vous souhaitez également stocker des informations d'activité, vous pouvez ajouter Shared Service à votre liste de fournisseurs de modules principaux (app.module).
Ensuite, vous pouvez le fournir directement à vos composants,
Avec Shared Service, vous pouvez utiliser des fonctions ou créer un objet pour mettre à jour plusieurs emplacements à la fois.
Dans votre composant de liste, vous pouvez publier des informations sur les éléments cliqués,
puis vous pouvez récupérer ces informations dans votre composant de détail:
De toute évidence, les données qui répertorient les partages de composants peuvent être n'importe quoi. J'espère que cela t'aides.
la source
Vous devez configurer la relation parent-enfant entre vos composants. Le problème est que vous pouvez simplement injecter les composants enfants dans le constructeur du composant parent et le stocker dans une variable locale. Au lieu de cela, vous devez déclarer les composants enfants dans votre composant parent à l'aide du
@ViewChild
déclarateur de propriété. Voici à quoi devrait ressembler votre composant parent:https://angular.io/docs/ts/latest/api/core/index/ViewChild-var.html
https://angular.io/docs/ts/latest/cookbook/component-communication.html#parent-to-view-child
Attention, le composant enfant ne sera pas disponible dans le constructeur du composant parent, juste après l'
ngAfterViewInit
appel du hook de cycle de vie. Pour attraper ce hook, implémentez simplement l'AfterViewInit
interface dans votre classe parent de la même manière que vous le feriez avecOnInit
.Mais, il existe d'autres déclarateurs de propriété comme expliqué dans cette note de blog: http://blog.mgechev.com/2016/01/23/angular2-viewchildren-contentchildren-difference-viewproviders/
la source
Sujets de comportement. J'ai écrit un blog à ce sujet.
Dans cet exemple, je déclare un sujet de comportement noid de type number. C'est aussi un observable. Et si "quelque chose s'est passé", cela changera avec la fonction new () {}.
Ainsi, dans les composants du frère, l'un appellera la fonction, pour effectuer le changement, et l'autre sera affecté par ce changement, ou vice-versa.
Par exemple, j'obtiens l'identifiant de l'URL et mets à jour le noid du sujet de comportement.
Et de l'autre côté, je peux demander si cet identifiant est "ce que je veux" et faire un choix après cela, dans mon cas si je veux supprimer une tâche, et cette tâche est l'url actuelle, elle doit me rediriger à la maison:
la source
Ce n'est pas exactement ce que vous voulez, mais cela vous aidera à coup sûr
Je suis surpris qu'il n'y ait pas plus d'informations sur la communication des composants <=> considérez ce tutoriel par angualr2
Pour la communication des composants frères et sœurs, je suggérerais d'aller avec
sharedService
. Il existe également d'autres options disponibles.Veuillez vous référer au lien en haut pour plus de code.
Edit: Ceci est une toute petite démo. Vous avez déjà mentionné que vous avez déjà essayé avec
sharedService
. Veuillez donc considérer ce tutoriel par angualr2 pour plus d'informations.la source
J'ai transmis des méthodes setter du parent à l'un de ses enfants via une liaison, appelant cette méthode avec les données du composant enfant, ce qui signifie que le composant parent est mis à jour et peut ensuite mettre à jour son deuxième composant enfant avec les nouvelles données. Cela nécessite une liaison «this» ou l'utilisation d'une fonction de flèche.
Cela présente l'avantage que les enfants ne sont pas tellement couplés les uns aux autres car ils n'ont pas besoin d'un service partagé spécifique.
Je ne suis pas tout à fait sûr que ce soit la meilleure pratique, il serait intéressant d'entendre les opinions des autres à ce sujet.
la source