Angulaire 2 - Réglage de la valeur sélectionnée sur la liste déroulante

j'ai rencontré un problème dans la présélection des valeurs sur une liste déroulante en angle 2.

j'ai défini un tableau de couleurs dans le composant que je lie avec succès à la liste déroulante. Le problème que je rencontre est avec la présélection d'une valeur sur la page init.

la ligne [selected]="car.color.id == x.id" doit sélectionner la valeur qui a été fixée sur le modèle de voiture this.car.color = new Colour(-1,''); cependant cela ne fonctionne que lorsque je règle l'id de couleur de la voiture au dernier article dans le liste (dans ce cas-noire) this.car.color = new Colour(4,'');

j'utilise la dernière version D'Angular (rc3) et j'ai connu les mêmes problèmes dans rc1 et rc2.

Voici un plunker montrant le problème.

https://plnkr.co/edit/yIVEeLK7PUY4VQFrR48g?p=preview

un autre aspect étrange est que lorsque l'on regarde les méta-données Angular a défini la valeur sélectionnée à true.

enter image description here

mais le dropdown semble toujours vide.

enter image description here

il semble qu'il s'agisse d'une question distincte de ces questions connexes.

Angulaire 2 fixer le point de départ de la valeur de sélectionner

sélectionner l'élément de Liaison d'objet dans Angulaire 2

comment utiliser select / option / NgFor sur un tableau D'objets en Angular2

concerne

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;
}
43
demandé sur Adrita Sharma 2016-06-22 15:56:10

6 réponses

définir car.colour à la valeur que vous voulez avoir initialement sélectionné fonctionne généralement.

lorsque car.colour est défini, vous pouvez supprimer [selected]="car.color.id == x.id" .

si la valeur n'est pas une chaîne de caractères [ngValue]="..." doit être utilisée. [value]="..." supporte uniquement les cordes.

44
répondu Günter Zöchbauer 2017-02-16 15:29:50

Angulaire 2 simple liste déroulante valeur sélectionnée

il peut aider quelqu'un que j'ai besoin de montrer seulement la valeur sélectionnée, n'ont pas besoin de déclarer quelque chose dans le composant et 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>
12
répondu Muhammad Shahzad 2018-02-02 08:10:08

Merci pour le tuyau Günter, il m'a fait avancer dans la bonne direction. Il y avait une faute d'orthographe de 'couleur' dans ma solution qui causait des problèmes et j'ai dû utiliser 'ngValue' et non 'value' dans le modèle html.

Voici la solution complète en utilisant des objets pour le ngModel et en sélectionnant les options de liste et en évitant l'utilisation de l'attribut [selected].

j'ai mis à jour le piston pour montrer la solution complète de travail. 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;
}
11
répondu CountZero 2016-06-22 13:58:23

cet exemple de solution est pour la forme réactive

 <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 où vous initialisez votre formGroup ou plus tard,selon votre besoin.

vous pouvez le faire en utilisant la liaison [(ngModel)] aussi là où vous n'avez pas à initialiser votre formControl.

exemple avec liaison [(ngModel)]

 <select [(ngModel)]="matchedCity" formControlName="city" class="form-control input-sm">
                  <option *ngFor="let city of cities" [ngValue]="city">{{city.cityName}}</option>
                </select>

Ici, matchedCity est un objet dans les villes.

4
répondu Nabin Kumar Khatiwada 2018-03-05 15:09:57

ça me va.

<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 c'est valable ou pas, corrigez-moi si c'est faux.

Corrigez-moi si cela ne devrait pas être comme ça.

0
répondu Dharam Mali 2018-04-12 08:08:53

je voudrais ajouter, [ngValue]="..."supportez les chaînes, mais vous devez ajouter des guillemets simples si cela représente un nombre, comme [ngValue]="'...'". Il s'agissait de compléter la réponse de Günter Zöchbauer.

-1
répondu Antoine CAPLAIN 2018-03-30 13:30:08