Кутові параметри випадання 2 Значення за замовчуванням


115

У Angular 1 я міг вибрати параметр за замовчуванням для спадного поля, використовуючи наступне:

<select 
    data-ng-model="carSelection"
    data-ng-options = "x.make for x in cars" data-ng-selected="$first">
</select>

У куті 2 у мене є:

<select class="form-control" [(ngModel)]="selectedWorkout" (ngModelChange)="updateWorkout($event)">
    <option *ngFor="#workout of workouts">{{workout.name}}</option>
</select>

Як я можу вибрати параметр за замовчуванням, враховуючи дані мого параметра:

[{name: 'arm'}, {name: 'back'}, {name:'leg'}]а моє значення I за замовчуванням увімкнено back?

Відповіді:


77

Додайте прив’язку до selectedвластивості, наприклад:

<option *ngFor="#workout of workouts" 
    [selected]="workout.name == 'back'">{{workout.name}}</option>

4
Це, здається, не працює, дивлячись на вибраний
вами

@ClickThisNick Це спрацювало, коли я тестував його. Дивіться цей plnkr . Коли він закінчує завантаження, спадне меню вибору показує "два", хоча нормальним типовим значенням буде перший елемент ("один").
Дуглас

2
Різниця з кодом у @Douglas plnr полягає в тому, що він не має [(ngModel)]прив'язки, тому він слухає [selected]прив'язку в plnkr, а не в кодені OP (див. Мою відповідь за посиланням на роздвоєний plnr, який пояснює цей ефект)
Matthijs

2
Використання динамічних форм: selected="workout.name == 'back'"Реактивне використання форм:[selected]=workout.name == 'back'
fidev

@fidev, у вас є чудова відповідь, і саме це я шукав. Просто погляньте, що у вашому прикладі "Реактивні форми" відсутні ". Я використовував ваш код із іншою подібною змінною[selected]="workout.name == exercise.name"
Alfa Bravo

48

Якщо ви призначите значення за замовчуванням selectedWorkout і використання [ngValue](що дозволяє використовувати об'єкти в якості значення - в іншому випадку тільки рядок підтримується) , то він повинен робити те , що ви хочете:

<select class="form-control" name="sel" 
    [(ngModel)]="selectedWorkout" 
    (ngModelChange)="updateWorkout($event)">
  <option *ngFor="let workout of workouts" [ngValue]="workout">
    {{workout.name}}
  </option>
</select>

Переконайтесь, що значення, якому ви присвоюєте selectedWorkout, той самий екземпляр, що і той, який використовується в workouts. Інший екземпляр об'єкта навіть із тими ж властивостями та значеннями не буде розпізнаний. Перевіряється лише ідентичність об'єкта.

оновлення

Кутова додана підтримка compareWith, що полегшує встановлення значення за замовчуванням при [ngValue]використанні (для об'єктних значень)

З документів https://angular.io/api/forms/SelectControlValueAccessor

<select [compareWith]="compareFn"  [(ngModel)]="selectedCountries">
    <option *ngFor="let country of countries" [ngValue]="country">
        {{country.name}}
    </option>
</select>
compareFn(c1: Country, c2: Country): boolean {
    return c1 && c2 ? c1.id === c2.id : c1 === c2;
}

Таким чином, інший (новий) екземпляр об'єкта може бути встановлений як значення за замовчуванням і compareFnвикористовується для з'ясування, чи слід їх вважати рівними (наприклад, якщо idвластивість однакова.


2
якщо у вас є час, ви могли б зробити планку для цього? Чомусь, коли я пробую це, $ event походить як подія, а не об'єкт. Якщо я змінити подію на event.target.value, значення наближається до рядка типу "[object]"
crh225

Я думаю, було б корисніше, якщо ви спробуєте створити Plunker, який дозволяє відтворити вашу проблему ;-) Можливо, ви використовуєте [value]замість, [ngValue]або ваш код якось спричиняє перетворення значення в рядок.
Günter Zöchbauer

Що роблять c1і c2вказують у compareFn? А також, як працює оцінка в функціональному органі?
DongBin Kim

Значення selectedCountriesіcountry
Гюнтер Зехбауер

1
Я працював завдяки першій частині цієї відповіді.
The Sharp Ninja

35

просто встановіть значення моделі за замовчуванням, яке ви хочете, як це:

selectedWorkout = 'back'

Я створив вилку plnkr @Douglas ' тут , щоб продемонструвати різні способи , щоб отримати бажане поведінку в angular2.


1
щоб це працювало для мене (у куті 4), я також повинен був встановити [ngValue] = "val". Мій itemssource не був масивом об'єктів, а лише масивом рядків. <select [(ngModel)]="selectedTimeFrame"> <option *ngFor="let val of timeFrames" [ngValue]="val">val</option> </select>
S. Robijns

33

Додайте цей код у положення o списку вибору.

<option [ngValue]="undefined" selected>Select</option>


1
яка мета встановити [ngValue] на невизначений?
bluePearl

1
Це має бути прийнятою відповіддю. Встановлення [ngValue] на невизначене правильно обробляється зі значенням за замовчуванням, вибраним під час першого вибору "select".
Макс

Погодився, це правильна відповідь. Дозволяє використовувати варіант у позиції 0
mobiusinversion

@bluePearl модель "SelectedWorkout" починається як "невизначена", якщо ви нічого не встановите. Тоді це значення має бути де-значенням за замовчуванням.
Річард Агірре

Це найкраща відповідь
Річард Агірре

20

Ви можете підійти таким чином:

<option *ngFor="let workout of workouts" [value]="workout.name">{{workout.name}}</option>

або таким чином:

  <option *ngFor="let workout of workouts" [attr.value]="workout.name" [attr.selected]="workout.name == 'leg' ? true : null">{{workout.name}}</option>

або ви можете встановити значення за замовчуванням таким чином:

<option [value]="null">Please Select</option>
<option *ngFor="let workout of workouts" [value]="workout.name">{{workout.name}}</option>

або

<option [value]="0">Please Select</option>
<option *ngFor="let workout of workouts" [value]="workout.name">{{workout.name}}</option>

14

Використовуйте індекс, щоб показати перше значення за замовчуванням

<option *ngFor="let workout of workouts; #i = index" [selected]="i == 0">{{workout.name}}</option>

5

Відповідно до https://angular.io/api/forms/SelectControlValueAccessor вам просто потрібно:

theView.html:

<select [compareWith]="compareFn"  [(ngModel)]="selectedCountries">
    <option *ngFor="let country of countries" [ngValue]="country">
        {{country.name}}
    </option>
</select>

theComponent.ts

import { SelectControlValueAccessor } from '@angular/forms';
    compareFn(c1: Country, c2: Country): boolean {
    return c1 && c2 ? c1.id === c2.id : c1 === c2;
}

4

Трохи потрудився з цим, але закінчився наступним рішенням ... можливо, це комусь допоможе.

HTML-шаблон:

<select (change)="onValueChanged($event.target)">
    <option *ngFor="let option of uifOptions" [value]="option.value" [selected]="option == uifSelected ? true : false">{{option.text}}</option>
</select>

Компонент:

import { Component, Input, Output, EventEmitter, OnInit } from '@angular/core';    
export class UifDropdownComponent implements OnInit {
    @Input() uifOptions: {value: string, text: string}[];
    @Input() uifSelectedValue: string = '';
    @Output() uifSelectedValueChange:EventEmitter<string> = new EventEmitter<string>();
    uifSelected: {value: string, text: string} = {'value':'', 'text':''};

    constructor() { }

    onValueChanged(target: HTMLSelectElement):void {
        this.uifSelectedValue = target.value;
        this.uifSelectedValueChange.emit(this.uifSelectedValue);
    }

    ngOnInit() {
        this.uifSelected = this.uifOptions.filter(o => o.value == 
        this.uifSelectedValue)[0];
    }
}

3

Повністю розроблені інші публікації, ось що працює у програмі Angular2 Quickstart,

Щоб встановити значення DOM за замовчуванням: поряд із цим *ngFor, використовуйте умовний оператор у <option>sselected атрибуті .

Щоб встановити Control замовчуванням: використовуйте його аргумент конструктора. В іншому випадку перед зміною, коли користувач повторно вибирає параметр, який встановлює значення елемента керування атрибутом значення вибраного параметра, значення керування буде нульовим.

сценарій:

import {ControlGroup,Control} from '@angular/common';
...
export class MyComponent{
  myForm: ControlGroup;
  myArray: Array<Object> = [obj1,obj2,obj3];
  myDefault: Object = myArray[1]; //or obj2

  ngOnInit(){ //override
    this.myForm = new ControlGroup({'myDropdown': new Control(this.myDefault)});
  }
  myOnSubmit(){
    console.log(this.myForm.value.myDropdown); //returns the control's value 
  }
}

розмітка:

<form [ngFormModel]="myForm" (ngSubmit)="myOnSubmit()">
  <select ngControl="myDropdown">
    <option *ngFor="let eachObj of myArray" selected="eachObj==={{myDefault}}"
            value="{{eachObj}}">{{eachObj.myText}}</option>
  </select>
  <br>
  <button type="submit">Save</button>
</form>

3

Ви можете використовувати це [ngModel]замість, [(ngModel)]і це нормально

<select class="form-control" **[ngModel]="selectedWorkout"** (ngModelChange)="updateWorkout($event)">
   <option *ngFor="#workout of workouts">{{workout.name}}</option>
</select>

3

Ви можете зробити так, як описано вище:

<select class="form-control" 
        [(ngModel)]="selectedWorkout" 
        (ngModelChange)="updateWorkout($event)">
    <option *ngFor="#workout of workouts;
                    let itemIndex = index"
            [attr.selected]="itemIndex == 0">
    {{workout.name}}
    </option>
</select>

У наведеному вище коді, як ви бачите, обраний атрибут повторюваного параметра встановлюється при перевірці індексу повторюваного циклу списку. [attr. <html ім'я атрибута>] використовується для встановлення атрибута html у angular2.

Іншим підходом буде встановлення модельного значення у файлі typecript:

this.selectedWorkout = this.workouts.length > 0
                       ? this.workouts[0].name
                       : 'No data found';//'arm'

1

Додайте до відповіді @Matthijs, будь ласка, переконайтесь, що у вашого selectелемента є nameатрибут та nameвін унікальний у вашому HTML-шаблоні. Angular 2 використовує ім'я вводу для оновлення змін. Таким чином, якщо є дублюються імена або немає вкладеного імені до вхідного елемента, прив'язка не вдасться.


0

Додайте вибране властивість прив'язки, але переконайтеся, що воно недійсне для інших полів, наприклад:

<option *ngFor="#workout of workouts" [selected]="workout.name =='back' ? true: null">{{workout.name}}</option>

Тепер це спрацює


0
<select class="form-control" name='someting' [ngModel]="selectedWorkout" (ngModelChange)="updateWorkout($event)">
    <option value="{{workout.name}}" *ngFor="#workout of workouts">{{workout.name}}</option>
</select>

Якщо ви використовуєте форму, nameвсередині повинно бути полеselect тегу .

Все, що вам потрібно зробити, це просто додати valueдоoption тегу.

selectedWorkout значення повинно бути "назад", і його зроблено.


0

Якщо ви не хочете двосторонньої прив'язки через [(ngModel)], зробіть це:

<select (change)="selectedAccountName = $event.target.value">
  <option *ngFor="let acct of accountsList" [ngValue]="acct">{{ acct.name }}</option>
</select>

Щойно перевірений на моєму проекті на Angular 4, і він працює! AccountList - це масив облікових записів, ім'я яких є властивістю Account.

Цікаве спостереження:
[ngValue] = "acct" дає такий же результат, як [ngValue] = "acct.name".
Не знаєте, як саме Angular 4 це досяг!


0

Крок: 1 Створення властивостей оголосити клас

export class Task {
    title: string;
    priority: Array<any>;
    comment: string;

    constructor() {
        this.title      = '';
        this.priority   = [];
        this.comment    = '';
     }
}

Стебло: 2 Ваш клас компонентів

import { Task } from './task';

export class TaskComponent implements OnInit {
  priorityList: Array<any> = [
    { value: 0, label: '✪' },
    { value: 1, label: '★' },
    { value: 2, label: '★★' },
    { value: 3, label: '★★★' },
    { value: 4, label: '★★★★' },
    { value: 5, label: '★★★★★' }
  ];
  taskModel: Task           = new Task();

  constructor(private taskService: TaskService) { }
  ngOnInit() {
    this.taskModel.priority     = [3]; // index number
  }
}

Крок: 3 Переглянути файл .html

<select class="form-control" name="priority" [(ngModel)]="taskModel.priority"  required>
    <option *ngFor="let list of priorityList" [value]="list.value">
      {{list.label}}
    </option>
</select>

Вихід:

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


0

Для мене я визначаю деякі властивості:

disabledFirstOption = true;

get isIEOrEdge(): boolean {
    return /msie\s|trident\/|edge\//i.test(window.navigator.userAgent)
}

Потім у конструкторі та ngOnInit

constructor() {
    this.disabledFirstOption = false;
}

ngOnInit() {
    setTimeout(() => {
        this.disabledFirstOption = true;
    });
}

І в шаблон я додаю це як перший варіант всередині елемента вибору

<option *ngIf="isIEOrEdge" [value]="undefined" [disabled]="disabledFirstOption" selected></option>

Якщо ви дозволите вибрати перший варіант, ви можете просто видалити використання властивості disabledFirstOption


0

У моєму випадку тут this.selectedtestSubmitResultViewвстановлено значення за замовчуванням на основі умов, а змінна testSubmitResultViewповинна бути однаковою як testSubmitResultView. Це справді працювало для мене

<select class="form-control" name="testSubmitResultView"  [(ngModel)]="selectedtestSubmitResultView" (ngModelChange)="updatetestSubmitResultView($event)">
    <option *ngFor="let testSubmitResultView of testSubmitResultViewArry" [ngValue]="testSubmitResultView" >
        {{testSubmitResultView.testSubmitResultViewName}}
    </option>
</select>

Для отримання додаткової інформації,

testSubmitResultViewArry: Array<any> = [];
selectedtestSubmitResultView: string;
    
getTestSubmitResultViewList() {
    try {
        this.examService.getTestSubmitResultViewDetails().subscribe(response => {
            if (response != null && response !== undefined && response.length > 0) {
                response.forEach(x => {
                    if (x.isDeleted === false) {
                        this.testSubmitResultViewArry.push(x);
                    }
                    if (x.isDefault === true) {
                        this.selectedtestSubmitResultView = x;
                    }
                })
            }
        });
    } catch (ex) {
        console.log('Method: getTestSubmitResultViewList' + ex.message);
    }
}

-1

Я раніше стикався з цим питанням, і вирішив його різним простим способом вирішення

Для вашого Component.html

      <select class="form-control" ngValue="op1" (change)="gotit($event.target.value)">

      <option *ngFor="let workout of workouts" value="{{workout.name}}" name="op1" >{{workout.name}}</option>

     </select>

Тоді у вашому компоненті.ts ви можете виявити вибраний варіант за допомогою

gotit(name:string) {
//Use it from hare 
console.log(name);
}

-1

чудово працює, як видно нижче:

<select class="form-control" id="selectTipoDocumento" formControlName="tipoDocumento" [compareWith]="equals"
          [class.is-valid]="this.docForm.controls['tipoDocumento'].valid &&
           (this.docForm.controls['tipoDocumento'].touched ||  this.docForm.controls['tipoDocumento'].dirty)"
          [class.is-invalid]="!this.docForm.controls['tipoDocumento'].valid &&
           (this.docForm.controls['tipoDocumento'].touched ||  this.docForm.controls['tipoDocumento'].dirty)">
            <option value="">Selecione um tipo</option>
            <option *ngFor="let tipo of tiposDocumento" [ngValue]="tipo">{{tipo?.nome}}</option>
          </select>

-1

Вам просто потрібно поставити ngModel і вибране значення:

<select id="typeUser" ngModel="Advanced" name="typeUser">
  <option>Basic</option>
  <option>Advanced</option>
  <option>Pro</option>
</select>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.