Je suis tombé sur un problème de présélection des valeurs dans une liste déroulante dans Angular 2.
Je définis un tableau de couleurs dans le composant que je lie avec succès à la liste déroulante. Le problème que je rencontre concerne la présélection d'une valeur sur la page init.
La ligne [selected]="car.color.id == x.id"
devrait sélectionner la valeur qui a été définie sur le modèle de voiture this.car.color = new Colour(-1,'');
, mais cela ne fonctionne que si je règle l'identifiant de couleur de voiture sur le dernier élément de la liste (en l'occurrence noir) this.car.color = new Colour(4,'');
J'utilise la dernière version de Angular (rc3) et j'ai rencontré les mêmes problèmes avec rc1 et rc2.
Voici un plunker montrant le problème.
https://plnkr.co/edit/yIVEeLK7PUY4VQFrR48g?p=preview
Un autre aspect étrange est que lorsque vous regardez les métadonnées, Angular a défini la valeur sélectionnée sur true.
Mais la liste déroulante semble toujours vide.
Cela semble être une question distincte de ces questions connexes.
Valeur angulaire 2 définie du début de la sélection
élément de liaison à un objet dans Angular 2
Comment utiliser select/option/NgFor sur un tableau d'objets dans Angular2
Cordialement
Steve
Modèle de composant
<div>
<label>Colour</label>
<div>
<select [(ngModel)]="car.colour"">
<option *ngFor="let x of colours" [value]="x.id" [selected]="car.color.id == x.id">{{x.name}}</option>
</select>
</div>
</div>
Composant
import { Component, OnInit } from '@angular/core';
import {AbstractControl,FORM_DIRECTIVES } from '@angular/common';
@Component({
selector:'dropdown',
templateUrl:'app/components/dropdown/dropdown.component.html',
directives:[FORM_DIRECTIVES]
})
export class DropdownComponent implements OnInit
{
car:Car = new Car();
colours = Array<Colour>();
ngOnInit(): void {
this.colours = Array<Colour>();
this.colours.Push(new Colour(-1, 'Please select'));
this.colours.Push(new Colour(1, 'Green'));
this.colours.Push(new Colour(2, 'Pink'));
this.colours.Push(new Colour(3, 'Orange'));
this.colours.Push(new Colour(4, 'Black'));
this.car = new Car();
this.car.color = new Colour(-1,'');
}
}
export class Car
{
color:Colour;
}
export class Colour
{
constructor(id:number, name:string) {
this.id=id;
this.name=name;
}
id:number;
name:string;
}
Régler car.colour
sur la valeur que vous souhaitez sélectionner initialement fonctionne normalement.
Lorsque car.colour
est défini, vous pouvez supprimer [selected]="car.color.id == x.id"
.
Si la valeur n'est pas une chaîne, [ngValue]="..."
doit être utilisé. [value]="..."
ne supporte que les chaînes.
Cela peut aider quelqu'un car je n'ai besoin que d'afficher la valeur sélectionnée, de ne pas déclarer quelque chose dans le composant, etc.
Si votre statut provient de la base de données, vous pouvez afficher la valeur sélectionnée de cette façon.
<div class="form-group">
<label for="status">Status</label>
<select class="form-control" name="status" [(ngModel)]="category.status">
<option [value]="1" [selected]="category.status ==1">Active</option>
<option [value]="0" [selected]="category.status ==0">In Active</option>
</select>
</div>
Merci pour le conseil Günter, cela m'a permis d'avancer dans la bonne direction. Il y avait une mauvaise orthographe de "couleur" dans ma solution qui posait problème et je devais utiliser "ngValue" et non "valeur" dans le modèle html.
Voici la solution complète utilisant des objets pour ngModel et les options de liste de sélection et évitant l’utilisation de l’attribut [selected].
J'ai mis à jour le Plunker pour afficher la solution de travail complète. https://plnkr.co/edit/yIVEeLK7PUY4VQFrR48g?p=preview
Modèle de composant
<div>
<label>Colour</label>
<div *ngIf="car != null">
<select [(ngModel)]="car.colour">
<option *ngFor="let x of colours" [ngValue]="x" >{{x.name}}</option>
</select>
</div>
</div>
Composant
import { Component, OnInit } from '@angular/core';
import {AbstractControl,FORM_DIRECTIVES } from '@angular/common';
@Component({
selector:'dropdown',
templateUrl:'app/components/dropdown/dropdown.component.html',
directives:[FORM_DIRECTIVES]
})
export class DropdownComponent implements OnInit
{
car:Car;
colours: Array<Colour>;
ngOnInit(): void {
this.colours = Array<Colour>();
this.colours.Push(new Colour(-1, 'Please select'));
this.colours.Push(new Colour(1, 'Green'));
this.colours.Push(new Colour(2, 'Pink'));
this.car = new Car();
this.car.colour = this.colours[1];
}
}
export class Car
{
colour:Colour;
}
export class Colour
{
constructor(id:number, name:string) {
this.id=id;
this.name=name;
}
id:number;
name:string;
}
<select formControlName="preferredBankAccountId" class="form-control">
<option *ngFor="let item of societyAccountDtos" [value]="item.societyAccountId" >
{{item.nickName}}
</option>
</select>
Dans le composant:
this.formGroup.patchValue({
preferredBankAccountId: object_id_to_be_pre_selected
});
Vous pouvez également donner cette valeur à l'endroit où vous initialisez votre formGroup ou plus tard, en fonction de vos besoins.
Vous pouvez le faire en utilisant la liaison [(ngModel)] également là où vous ne devez pas initialiser votre formControl.
<select [(ngModel)]="matchedCity" formControlName="city" class="form-control input-sm">
<option *ngFor="let city of cities" [ngValue]="city">{{city.cityName}}</option>
</select>
MatchedCity est ici un objet à l'intérieur d'une ville.
Cela fonctionne pour moi.
<select formControlName="preferredBankAccountId" class="form-control" value="">
<option value="">Please select</option>
<option *ngFor="let item of societyAccountDtos" [value]="item.societyAccountId" >{{item.nickName}}</option>
</select>
Pas sûr que ce soit valide ou non, corrigez-moi si c'est faux.
Corrigez-moi si cela ne devait pas être comme ça.