2016-03-14 5 views
69

В Угловое 1 я мог выбрать вариант по умолчанию для выпадающего списка, используя следующие:Угловое 2 Dropdown Опции Значение по умолчанию

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

+0

Более простой способ: https://stackoverflow.com/a/41180705/4654957 –

ответ

44

Добавить привязку к selected собственности, как это:

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

Это не работает, глядя на мой выбранный параметр, у него нет какой-либо выбранной индикации – ClickThisNick

+0

@ClickThisNick Это сработало, когда Я протестировал его. См. [This plnkr] (https://plnkr.co/edit/vBqCr05sSeL3FWO8SJ1z?p=preview). Когда он заканчивает загрузку, выпадающий список выбора показывает «два», хотя стандартным по умолчанию будет первый элемент («один»). – Douglas

+2

Разница с кодом в @Douglas plnr заключается в том, что он не имеет привязки '[(ngModel)]', поэтому он прослушивает '[selected]' привязку в plnkr, а не в кодогенезе OP (см. Мой ответ для ссылки на раздвоенный plnr, который объясняет этот эффект) – Matthijs

29

просто установить значение модели используемого по умолчанию вы хотите, как это:

selectedWorkout = 'back' 

Я создал вилку @ Douglas 'plnkr here, чтобы продемонстрировать различные способы получения желаемого поведения в угловом2.

+1

, чтобы это работало для меня (в angular 4) Мне также пришлось установить [ngValue] = "val". My itemssource был не массивом объектов, а просто массивом строк. ' ' –

1

Полностью конкретизации другие сообщения, вот что работает в Angular2 QuickStart,

Чтобы установить DOM по умолчанию: наряду с *ngFor, использовать условный оператор в selected атрибуте <option> «s.

Чтобы установить значение 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> 
12

Используйте индекс, чтобы показать первое значение по умолчанию

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

Спасибо большое. Это то, что я искал. –

29

Если присвоить значение по умолчанию selectedWorkout и использовать [ngValue] (который позволяет использовать объекты в качестве значения - иначе только строка поддерживает Ted), то он должен делать то, что вы хотите:

<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

если у вас есть время, вы могли бы сделать plunkr для этого? когда я пытаюсь, $ event встречается как событие, а не объект. Если я изменяю событие на event.target.value, значение встречается как строка, такая как «[object]» – crh225

+0

. Я думаю, было бы более полезно, если бы вы пытаетесь создать Plunker, чтобы llows, чтобы воспроизвести вашу проблему ;-) Возможно, вы используете '[value]' вместо '[ngValue]' или ваш код каким-то образом вызывает преобразование значения в строку. –

0

Добавить связывающее свойство выбрано, но убедитесь, чтобы сделать его недействительным, для других областей, например:

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

Теперь он будет работать

0

Добавьте к ответу @Matthijs «ы, пожалуйста, убедитесь, что ваш Элемент select имеет атрибут name, а его name уникален в вашем шаблоне html. Угловой 2 использует имя ввода для изменения изменений. Таким образом, если есть дублированные имена или нет имени, прикрепленного к элементу ввода, привязка завершится неудачно.

3

Вы можете использовать что [ngModel] вместо [(ngModel)] и это Ok

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

Вы можете сделать это путь

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

или вы можете установить умолчанию используется именно vloue таким образом

<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> 
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 Значение должно быть «назад», и его сделано.

10

Добавить этот код в положение позиции выбора.

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

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> 

В коде выше, как вы можете видеть, выбранный атрибут повторяющейся опции устанавливается на проверку индекса повторяющегося цикла из списка. [Атр. < имя атрибута html>] используется для установки атрибута html в угловом2.

Другой подход будет установка значения модели в машинописном файл как:

this.selectedWorkout = this.workouts.length > 0 
         ? this.workouts[0].name 
         : 'No data found';//'arm' 
-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); 
} 
3

Повлиял немного с этим, но в итоге получилось следующее решение ... возможно, это поможет кому-то. Шаблон

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

Если вы не хотите, 2-полосная связывания с помощью [(ngModel)], сделайте следующее:

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

Только что испытал мой проект на Angular 4, и он работает! AccountList - это массив объектов Account, имя которого является свойством Account.

Интересное наблюдение:
[ngValue] = "acct" оказывает тот же результат, что и [ngValue] = "acct.name".
Не знаю, как Угловой 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> 

Выход:

enter image description here

-1

начал играть с AngularJS 4 и машинопись, и это сложно. Я использую Angular Reactive Forms (или модели Driven Form) и имеет Адрес, который содержит и страны поля, которые я хотел бы представить в качестве раскрывающегося списка со значениями по умолчанию. Я последовал ниже

  1. Создать address.ts модель (Адрес)
  2. Создать address.component.ts (AddressComponent)
  3. Создать address.component.html (шаблон)
  4. Импортируйте AddressComponent в свои модули (например, маршрутизатор, если у вас есть)

В модели address.ts как следовать


export class Address { 
    type: string; 
    street: string; 
    city: string; 
    postalcode: string; 
    provinces = ['AB', 'BC', 'MB', 'NB', 'NL', 'NS', 'NT', 
      'NU', 'ON', 'PE', 'QC', 'SK', 'YT']; 
    countries = ['Canada', 'USA']; 
} 

Вслед за address.component.ts


import { Component, Input, OnInit } from '@angular/core'; 
import { FormArray, FormGroup, FormBuilder, Validators } from '@angular/forms'; 

import { Address } from '../../models/address'; 

@Component({ 
    selector: 'address', 
    templateUrl: './address.component.html' 
}) 
export class AddressComponent implements OnInit { 
    @Input() 
    addressForm: FormGroup; 
    address = new Address(); 

    constructor (private fb: FormBuilder){} 

    ngOnInit(){ 
    this.addressForm = this.fb.group({ 
     type: ['', Validators.required], 
     street: [''], 
     city: ['', Validators.required], 
     postalcode: [''], 
     provinces: [this.address.provinces], 
     countries: [this.address.countries] 
    }); 
    } 
} 

с последующим address.component.html


<form [formGroup]="addressForm" class="address"> 
    <div class="form-group"> 
    <label>Address type</label> 
    <input type="text" class="form-control" formControlName="type"> 
    </div> 
    <div class="form-group"> 
    <label>Street</label> 
    <input type="text" class="form-control" formControlName="street"> 
    </div> 
    <div class="form-group"> 
    <label>City</label> 
    <input type="text" class="form-control" formControlName="city"> 
    </div> 
    <div class="form-group"> 
    <label>Postal code</label> 
    <input type="text" class="form-control" (formControlName)="postalcode"> 
    </div> 
    <div class="form-group"> 
    <label>Province</label> 
    <select class="form-control" formControlName="provinces"> 
     <option *ngFor="let province of address.provinces" [value]="province"> 
     {{province}} 
     </option> 
    </select> 
    </div> 
    <div class="form-group"> 
    <label>country</label> 
    <select class="form-control" formControlName="countries"> 
     <option *ngFor="let country of address.countries" [value]="country"> 
     {{country}} 
     </option> 
    </select> 
    </div> 
</form> 

С учетом указанных выше трех на месте, я могу вынести адрес самостоятельно, следуя приведенным ниже

  1. Обновление в приложение-routing.module.ts, где у меня есть собственные маршруты
  2. Обновление в app.module.ts
  3. Обновлять app.component.ts включать адрес в выпускном маршрутизатор теге

Update в приложение-routing.module.ts


import { NgModule } from '@angular/core'; 
import { RouterModule, Routes } from '@angular/router'; 

import { UserRegistrationComponent } from '../user/user-registration.component'; 

//temporary 
import { AddressComponent } from '../address/address.component'; 

const routes : Routes = [ 
    { path: 'user/register', component: UserRegistrationComponent }, 
    { path: 'temp/address', component: AddressComponent } 
] 

@NgModule({ 
    imports: [RouterModule.forRoot(routes)], 
    exports: [RouterModule] 
}) 
export class AppRoutingModule {} 

Вслед за app.module.TS импортировать AddressComponent и включить его в деклараций массив NgModule декоратор


import { NgModule }  from '@angular/core'; 
import { BrowserModule } from '@angular/platform-browser'; 
import { ReactiveFormsModule } from '@angular/forms'; 
import { HttpModule } from '@angular/http'; 

import { AppRoutingModule } from './modules/app-routing.module' 

import { AppComponent } from './app.component'; 
import { UserService } from './services/user.service' 

import { UserRegistrationComponent } from './user/user-registration.component'; 

//import temporary 
import { AddressComponent } from './address/address.component'; 

@NgModule({ 
    imports:  [ 
    BrowserModule, 
    ReactiveFormsModule, 
    HttpModule, 
    AppRoutingModule 
    ], 
    declarations: [ 
    AppComponent, 
    UserRegistrationComponent, 
    AddressComponent 
    ], 
    exports : [ 
    ], 
    providers: [ 
    UserService 
    ], 
    bootstrap: [ AppComponent ] 
}) 
export class AppModule { } 

И, наконец, обновить app.component.ts шаблон HTML, чтобы включить ссылку компонента адреса в так что мы можем перейти к нему и увидеть форму адреса в действии.


import { Component } from '@angular/core'; 

@Component({ 
    selector: 'my-app', 
    template: ` 
    <div class="container"> 
     <h1>Sample</h1> 
     <nav> 
     <a routerLink="/user/register" routerLinkActive="active">Register User</a><br> 
     <a routerLink="/temp/address" routerLinkActive="active">Address</a> 
     </nav> 
     <router-outlet></router-outlet> 
    </div> 

    `, 
}) 
export class AppComponent { name = 'Sample'; } 

И что это. Визуализированная форма адреса выглядит следующим образом:

enter image description here

Теперь у меня есть адрес реактивной компонента формы, который можно встраивать в любом месте мне нужно поле адреса. Он действительно много кода для поля адреса. Новый для AngularJS 4 и Typcript, поэтому код может иметь ошибки.

+0

его угловой4, а не угловой, в целом он угловатый без версии. –