Angular 2下拉选项默认值


115

在Angular 1中,我可以使用以下命令为下拉框选择默认选项:

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

在Angular 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'}]我的默认值是back多少?

Answers:


77

将绑定添加到selected属性,如下所示:

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

4
这似乎不起作用,看着我选择的选项,它没有任何选定的指示
ClickThisNick

@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"
阿尔法布拉沃

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。即使具有相同属性和值的另一个对象实例也不会被识别。仅检查对象身份。

更新

Angular添加了对的支持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更改为event.target.value,则该值会以字符串形式出现,例如“ [object]”
crh225 '16

我想如果您尝试创建一个允许重现您的问题的Plunker会更有用;-)也许您使用[value]而不是[ngValue]或您的代码以某种方式导致将值转换为字符串。
君特Zöchbauer

什么做c1c2指示compareFn?而且,功能主体中的评估如何工作?
DongBin Kim '18

价值selectedCountriescountry
冈特Zöchbauer

1
感谢此答案的第一部分,使我能够正常工作。
犀利的忍者

35

只需将模型的值设置为所需的默认值即可,如下所示:

selectedWorkout = 'back'

我在这里创建了@Douglas的plnkr的fork,以演示在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]设置为undefined的目的是什么?
bluePearl

1
这应该是公认的答案。将[ngValue]设置为undefined可以正确处理首次渲染“ select”时选择的默认值。
最多

同意这是正确的答案。允许您在位置0使用选项
mobiusinversion

如果没有设置@bluePearl,则模型'SelectedWorkout'将从'undefined'开始,然后需要将其设为默认值。
理查德·阿奎尔

这是最佳答案
Richard Aguirre

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>


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快速入门中的工作原理,

要设置DOM默认值:和一起使用*ngFor,请在<option>selected属性中使用条件语句。

设置Control的默认值:使用其构造函数参数。否则,在onchange之前,当用户重新选择一个选项时(该控件使用所选选项的value属性设置控件的值),控件值将为null。

脚本:

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属性名称>]用于在angular2中设置html属性。

另一种方法是将打字稿文件中的模型值设置为:

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

1

添加到@Matthijs的答案,请确保您的select元素具有name属性,并且name在html模板中是唯一的。Angular 2使用输入名称来更新更改。因此,如果存在重复的名称或没有名称附加到输入元素,则绑定将失败。


0

添加选定的绑定属性,但对于其他字段,请确保将其设置为null,例如:

<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

您只需要添加valueoption标签即可。

selectedWorkout 值应为“ back”,并完成。


0

如果您不希望通过[(ngModel)]进行2向绑定,请执行以下操作:

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

刚刚在Angular 4上对我的项目进行了测试,它可以工作!accountList是Account对象的数组,其中name是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;
    });
}

然后在模板中,将其添加为select元素内的第一个选项

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

如果允许选择第一个选项,则只需删除属性disableFirstOption的用法即可。


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>

然后,在component.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>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.