Подтвердить что ты не робот

Angular 2 - Установка выбранного значения в выпадающем списке

У меня возникла проблема при предварительном выборе значений в раскрывающемся списке в Angular 2.

Я устанавливаю массив цветов в компоненте, который я привязываю успешно к выпадающему списку. Проблема, с которой я столкнулся, заключается в предварительном выборе значения на странице init.

Линия [selected]="car.color.id == x.id" должна выбирать значение, установленное в модели автомобиля this.car.color = new Colour(-1,'');, однако это работает только при установке идентификатора цвета автомобиля на последний элемент в списке (в данном случае черный) this.car.color = new Colour(4,'');

Я использую последнюю версию Angular (rc3) и испытываю те же проблемы в rc1 и rc2.

Вот плукер, показывающий проблему.

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

Другой нечетный аспект заключается в том, что при просмотре метаданных Angular установлено значение true.

введите описание изображения здесь

Но выпадающее меню по-прежнему остается пустым.

введите описание изображения здесь

Кажется, это отдельная проблема из этих связанных вопросов.

Angular 2 Задайте начальное значение для выбора

Привязка к элементу привязки к объекту в Angular 2

Как использовать select/option/NgFor для массива объектов в Angular2

Привет

Стив

Шаблон компонента

   <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>

Компонент

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;
}
4b9b3361

Ответ 1

Обычно устанавливается настройка car.colour на значение, которое вы хотите выбрать изначально.

Когда car.colour установлен, вы можете удалить [selected]="car.color.id == x.id".

Если значение не является строкой [ngValue]="...", необходимо использовать. [value]="..." поддерживает только строки.

Ответ 2

Angular 2 простое выпадающее меню

Это может помочь кому-то, поскольку мне нужно показывать только выбранное значение, не нужно объявлять что-то в компоненте и т.д.

Если ваш статус поступает из базы данных, вы можете показать выбранное значение таким образом.

 <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>

Ответ 3

Спасибо за отзыв Günter, он заставил меня двигаться в правильном направлении. В моем решении было неправильное совпадение "цвета", которое вызывало проблемы, и мне нужно было использовать "ngValue", а не "значение" в шаблоне html.

Вот полное решение с использованием объектов для ngModel и выбора опций списка и избежания использования атрибута [selected].

Я обновил Plunker, чтобы показать полное рабочее решение. https://plnkr.co/edit/yIVEeLK7PUY4VQFrR48g?p=preview

Шаблон компонента

 <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>

Компонент

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;
}