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

回答:


77

次のselectedように、プロパティにバインディングを追加します。

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

4
それは機能していないように見えます。選択したオプションを見ると、どのような種類の選択された表示もありません
ClickThisNick

@ClickThisNick私がそれをテストしたときそれは働いた。このplnkrを参照してください。ロードが完了すると、通常のデフォルトが最初の要素(「1」)であっても、選択ドロップダウンに「2」が表示されます。
ダグラス

2
@Douglas plnrのコードとの違いは、[(ngModel)]バインディングがないため[selected]、PLnkrでバインディングをリッスンし、OPのコーデンではリッスンしないことです(この影響を説明するフォークされたplnrへのリンクについては、私の回答を参照してください)
マタイス

2
動的フォームの使用:selected="workout.name == 'back'"リアクティブフォームの使用:[selected]=workout.name == 'back'
fidev 2017

@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。同じプロパティと値を持つ別のオブジェクトインスタンスは認識されません。オブジェクトIDのみがチェックされます。

更新

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.target.valueに変更すると、値は「[object]」のような文字列として出てきます
crh225

問題の再現を可能にするPlunkerを作成しようとすると、より役立つと思います;-) [value]代わりにを使用している[ngValue]か、コードが何らかの理由で値を文字列に変換している可能性があります。
ギュンターZöchbauer

c1c2示し、何を示しcompareFnますか?また、関数本体での評価はどのように機能しますか?
DongBin Kim

selectedCountriescountry
ギュンターZöchbauer

1
この回答の最初の部分のおかげで、うまくいきました。
シャープニンジャ

35

次のように、モデルの値を必要なデフォルトに設定するだけです。

selectedWorkout = 'back'

ここで@Douglas 'plnkrのフォークを作成して、angular2 目的の動作を実現するさまざまな方法を示しました。


1
これが機能するためには(angular 4)、[ngValue] = "val"も設定する必要がありました。私のitemssourceはオブジェクトの配列ではなく、単なる文字列の配列でした。<select [(ngModel)]="selectedTimeFrame"> <option *ngFor="let val of timeFrames" [ngValue]="val">val</option> </select>
S.ロビンス2017

33

このコードを選択リストのoの位置に追加します。

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


1
[ngValue]を未定義に設定する目的は何ですか?
bluePearl 2018

1
これは受け入れられる答えになるはずです。[ngValue]をundefinedに設定すると、「select」が最初にレンダリングされるときにデフォルト値が選択されるように適切に処理されます。
最大

これは正解だと同意しました。位置0でオプションを使用できます
mobiusinversion

@bluePearl何も設定しない場合、モデル「SelectedWorkout」は「未定義」として開始されます。次に、それがデフォルトの項目の値である必要があります。
Richard Aguirre

これが最良の答えです
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>

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クイックスタートで機能するものです、

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属性を設定するために使用されます。

別のアプローチはtypescriptファイルのモデル値を次のように設定することです:

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

1

@Matthijsの回答に追加してください。select要素にname属性があり、nameHTMLテンプレート内で一意であることを確認してください。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です。

タグに追加valueするだけoptionです。

selectedWorkout 値は "back"である必要があります。


0

[(ngModel)]による双方向バインディングが必要ない場合は、次のようにします。

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

Angular 4で私のプロジェクトでテストしたところ、うまくいきました!accountsListは、名前がAccountのプロパティである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>

最初のオプションの選択を許可する場合は、プロパティ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>

次に、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>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.