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

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 uneDirective.
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 quepersonContextfait référence à la classePersonComponentlorsque 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érencepersonqui a pour valeurpersonContextet qui n'est rien d'autre que la référence de notre composantPersonComponent.personContext.myGenderpermet d'avoir accès à la valeur de la variablemyGenderprésent dans le composantPersonComponent.
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'informationmyGenderest 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






