Skip to main content

Command Palette

Search for a command to run...

Partager des informations entre composants sans utiliser @Output() et les services

Updated
2 min read
Partager des informations entre composants sans utiliser @Output() et les services
E

Je suis Ezéchiel Amen AGBLA, Angular Developer Expert & Ionic Developer Expert, passionné par le développement web et mobile. Je mets la lumière sur des notions liées à Angular et à Ionic pour la communauté francophone.

En Angular, lorsque nous voulons partager des informations entre les composants, nous utilisons généralement le décorateur @Output() ou les services. Le décorateur @Output() nous permet de partager des données d'un composant enfant vers un composant parent. Pour ce qu'il en est des services, ils nous permettent d'avoir accès à une information peu importe la relation entre les composants.

Et si vous appreniez qu'il existe un autre moyen beaucoup plus simple de le faire ?
Ah bon ? 😁

Effectivement, il existe une autre façon encore plus simple d'avoir accès aux informations d'un composant depuis un autre composant.

Il s'agit de l'attribut exportAs. C'est un attribut utilisé sur les directives et donc valable également sur nos composants car un composant est avant tout une Directive.

Supposons que nous ayons un composant PersonComponent qui permet à l'utilisateur de choisir son genre :

@Component({
  selector: 'app-person',
  template: `
    <input type="radio" name="gender" [(ngModel)]="myGender" value="male" /> Male
    <input type="radio" name="gender" [(ngModel)]="myGender" value="female" /> Female
  `,
  exportAs: 'personContext'
})

export class PersonComponent {
    public myGender: string;
}
  • exportAs: 'personContext' permet d'indiquer que personContext fait référence à la classe PersonComponent lorsque nous voulons l'utiliser dans notre template HTML au moyen d'une variable de référence.

Par la suite, nous avons un autre composant AvatarComponent qui est chargé d'afficher un avatar en fonction du genre de la personne :

@Component({
  selector: 'app-avatar',
  template: `
   <img *ngIf="gender === 'male'" src="avatarMale.jpg" />
   <img *ngIf="gender === 'female'" src="avatarFemale.jpg" />
  `,
})

export class AvatarComponent {
   @Input() gender: string;
}

Pour finir, dans notre composant parent AppComponent par exemple, nous aimerions interagir entre le composant PersonComponent et le composant AvatarComponent. Voici ce qu'il faut faire :

<div>
 <app-avatar [gender]="personContext.myGender"></app-avatar>
</div>
<app-person #person="personContext"></app-person>
  • #person='personContext' est la variable de référence person qui a pour valeur personContext et qui n'est rien d'autre que la référence de notre composant PersonComponent.

  • personContext.myGender permet d'avoir accès à la valeur de la variable myGender présent dans le composant PersonComponent.

L'attribut exportAs, nous permet d'avoir accès aux attributs et méthodes publiques de notre composant afin d'interagir avec eux. Nous remarquons que l'information myGender est partagée entre les deux composants sans que nous ayons besoin de @Output() ou d'un service.

En somme, exportAs est un attribut qui nous évite d'injecter un service ou un composant pour partager des informations entre nos composants ainsi que l'utilisation du décorateur @Output().

Pour plus d'informations👉 exportAs

A

Très intéressant ! Je profite pour te dire que j'ai parcouru tes publications et je pense avoir trouvé un nouveau chez moi sur internet 😁😌.

1
E

Merci beaucoup pour ton feedback ! Ça fait vraiment plaisir de te lire !

1
C

Nous serions aussi très content si vous nous parliez des détections de changement sur toute sa profondeur surtout

1
E

Merci pour ton retour Claude Fassinou ! J'en tiendrai compte 😃

J

J'en ai jamais entendu parlé. Belle découverte. Merci.

1
C

Great!

1
E

Thanks !

More from this blog

A

angulardev.fr

25 posts

Je suis Ezéchiel Amen AGBLA, Angular Developer Expert & Ionic Developer Expert, passionné par le développement web et mobile.