J'ai utilisé la boîte de sélection de tapis de matériau angulaire (" @ angular / material": "7.1.0 "), puis j'ai utilisé le contrôle de formulaire au lieu du modèle ng, maintenant le problème est que je peux ' t définir la valeur lors du chargement du composant. Je dois définir la première valeur sur la zone de sélection de tapis dans la liste, j'ai essayé mais je ne peux pas le faire.
J'ai créé un code chez stackblitz, voici le lien: https://stackblitz.com/ modifier / angular-zt1a9f
Veuillez m'aider à ce sujet.
4 Réponses :
Utilisez compareWith
pour sélectionner la valeur par défaut en comparant le nom à l'intérieur de la fonction de comparaison. Notez également que j'ai changé la liaison value
en [(value)] = "animal"
. Et supprimé selectedValue
. Vous sélectionnez la valeur par défaut en l'attribuant dans le formControl
, regardez ci-dessous les changements dans le composant.
export class AppComponent { animals = [ {name: 'Dog', sound: 'Woof!'}, {name: 'Cat', sound: 'Meow!'}, {name: 'Cow', sound: 'Moo!'}, {name: 'Fox', sound: 'Wa-pa-pa-pa-pa-pa-pow!'}, ]; myGroup = new FormGroup({ animalControl: new FormControl(this.animals[1], [Validators.required]) //I'm assigining Cat by using this.animals[1], you can put any value you like as default. }); compareThem(o1, o2): boolean{ console.log('compare with'); return o1.name === o2.name; } }
Dans votre composant, ajoutez:
<form [formGroup]="myGroup"> <mat-form-field> <mat-select placeholder="Favorite animal" [compareWith]="compareThem" formControlName="animalControl" required > <mat-option>--</mat-option> <mat-option *ngFor="let animal of animals" [(value)] ="animal" > {{animal.name}} </mat-option> </mat-select> </mat-form-field> </form>
@Aragom, vous avez [ngValue] = "animal.name", doit être [ngValue] = "animal"
Thilagabahan, si la [valeur] est animals.name
selectedValue = this.animals[0].name; myGroup = new FormGroup({ animalControl: new FormControl(this.selectedValue, [Validators.required]) });
simplement, lorsque vous créez le formulaire, donnez la valeur (sinon regardez la réponse d'Aragom)
<mat-option *ngFor="let animal of animals" [value]="animal.name">
Voir que le dernier est de créer le formGroup
Lorsque vous affectez l'ensemble de l'objet animal
à la valeur de mat-option
, alors dans ce cas
vous devez utiliser une liaison de données bidirectionnelle pour fournir la valeur d'option sélectionnée.
Utilisez la liaison de données bidirectionnelle en tant que [(ngModel) ="selectedValue"
au lieu de [(value) ] = "selectedValue"
dans le code de votre application, et cette variable selectedValue
sera du type objet animal que vous attribuez à l'option mat-option
as
ngOnInit() { this.selectedValue = this.animals[0]; // selecting first aninmal object as default value }
Et maintenant, assignez cette variable dans ngOnint ()
comme
<mat-option *ngFor="let animal of animals" [value]="animal"> {{animal.name}} </mat-option>`
Démo Stackblitz - définition de la valeur de sélection de tapis lors du chargement du composant
Voici l'exemple
compareFn(c1: Country, c2: Country): boolean { if(c1 && c2) { (c1.id || c2.id) ? c1.id === c2.id : c1 === c2; } }
Si vos options ne contiennent pas l'identifiant, votre compareFn sera comme ci-dessous:
<mat-select [compareWith]="compareFn" [(ngModel)]="defaultItem"> <mat-option *ngFor="let country of countries" [value]="item"> {{country.name}} </mat-option> </mat-select> compareFn(c1: Country, c2: Country): boolean { return c1 && c2 ? c1.id === c2.id : c1 === c2; }
Ref1: https: //material.angular. io / components / select / overview # getting-and-setting-the-select-value Ref2: https://angular.io/api/forms/SelectControlValueAccessor#customizing- sélection d'options
J'ajouterais du code à la question, puis je lierais stackblitz pour vérifier les détails.