Je souhaite partager une variable chaîne avec 2 composants (parent et enfant) en utilisant Angular (dactylographié). J'utilise cette méthode mais je ne l'aime pas, car lorsque je mets à jour la variable d'entrée, le composant enfant se met automatiquement à jour; Je souhaite mettre à jour le composant enfant UNIQUEMENT lorsque le composant parent envoie les données à l'enfant. Comment puis-je faire?
Voici mon composant parent.html
@Input() testCity: string;
Voici mon composant parent.ts strong>
<p> Child compoent it works! </p>
Ceci est mon composant enfant.html
city: string; getWeather() { // I make an http request, but doesn't matter }
Et voici le composant.ts enfant
<div> <mat-form-field> <input matInput type="text" [(ngModel)]="city"> </mat-form-field> <button mat-button (click)="getWeather()"> <mat-icon matSuffix>search</mat-icon> </button> </div> <app-city-weather [testCity]="city"></app-city-weather>
3 Réponses :
Je créerais une propriété de classe distincte pour stocker la valeur de la ville uniquement pour le composant enfant:
// Template. <div> <mat-form-field> <input matInput type="text" [(ngModel)]="city"> </mat-form-field> <button mat-button (click)="getWeather()"> <mat-icon matSuffix>search</mat-icon> </button> </div> <app-city-weather [testCity]="cityChild"></app-city-weather> // Controller. city: string; cityChild: string; getWeather() { this.cityChild = this.city; // http request }
vous pouvez créer un service contenant vos données partagées
classe d'exportation cityService { city: chaîne }
fournissez ce service dans votre app.module
puis injectez ce service où vous voulez
dans chaque constructeur de composant
* ngIf
pour afficher de manière conditionnelle des données dans votre composant enfant Si votre problème est que les valeurs intermédiaires de la ville sont affichées dans votre composant enfant, tandis que l'utilisateur tape un nom de ville dans le composant parent et vous ne souhaitez afficher le nom de la ville finale dans votre composant enfant que lorsque l'utilisateur clique sur getWeather
qui transmet la météo à votre composant enfant, vous pouvez décider d'afficher la ville uniquement dans le modèle enfant lorsque l'enfant a également la météo.
Vous n'avez alors pas à vous soucier d'obtenir des valeurs intermédiaires pour testCity
dans le composant enfant, car la ville n'est affichée que lorsqu'une météo est définie .
Enfant
currentCity: Subject<string> = new Subject<string>(); getWeather(city: string) { // send current city to child this.currentCity.next(city); }
<input #cityInput matInput type="text"> <button mat-button (click)="getWeather(cityInput.value)">Get Weather</button> <app-city-weather [city]="currentCity.asObservable()"></app-city-weather>
Parent p >
@Input() city$: Observable<string>;
<p>{{ city$ | async }}</p>
Subject
pour envoyer explicitement des données en tant qu'événement à l'enfant Si vous avez besoin d'envoyer des données en tant qu'événement du parent à l'enfant, vous pouvez créer un Sujet
dans le parent et transmettez-le comme Observable
à l'enfant auquel vous vous abonnez aux changements de valeur.
Enfant
city: string; weather: string; getWeather() { this.weather = 'Sunny'; }
<input matInput type="text" [(ngModel)]="city"> <button mat-button (click)="getWeather()">Get Weather</button> <app-city-weather [testCity]="city" [weather]="weather"></app-city-weather>
Parent
Si vous n'avez besoin que de la ville dans le getWeather
et dans le composant enfant, vous pouvez supprimer [(ngModel)] = "city"
et lire directement la valeur de l'entrée et la transmettre à getWeather
.
@Input() testCity: string; @Input() weather: string;
<p *ngIf="weather">{{ testCity }}</p> <div>{{ weather }}</div>
Merci, je pense y avoir pensé aussi, je choisis la solution numéro 1.
où appelle-t-on l'enfant à partir du modèle parent
Désolé, j'ai oublié de l'écrire. Je mets à jour la question!
Comment transmettez-vous la météo au composant enfant? Pourriez-vous ajouter comment
getWeather ()
interagit avec le composant enfant.