Angular 2の「select」で新しい選択を取得するにはどうすればよいですか?


372

Angular 2(TypeScript)を使用しています。

新しいセレクションで何かしたいのですが、入ってくるのonChange()は常に最後のセレクションです。新しいセレクションを入手するにはどうすればよいですか?

<select [(ngModel)]="selectedDevice" (change)="onChange($event)">
   <option *ngFor="#i of devices">{{i}}</option>
</select>
onChange($event) {
    console.log(this.selectedDevice);
    // I want to do something here with the new selectedDevice, but what I
    // get here is always the last selection, not the one I just selected.
}

回答:


749

双方向のデータバインディングが必要ない場合:

<select (change)="onChange($event.target.value)">
    <option *ngFor="let i of devices">{{i}}</option>
</select>

onChange(deviceValue) {
    console.log(deviceValue);
}

双方向データバインディングの場合は、イベントバインディングとプロパティバインディングを分離します。

<select [ngModel]="selectedDevice" (ngModelChange)="onChange($event)" name="sel2">
    <option [value]="i" *ngFor="let i of devices">{{i}}</option>
</select>
export class AppComponent {
  devices = 'one two three'.split(' ');
  selectedDevice = 'two';
  onChange(newValue) {
    console.log(newValue);
    this.selectedDevice = newValue;
    // ... do other stuff here ...
}

devicesがオブジェクトの配列の場合はngValuevalue次の代わりにバインドします。

<select [ngModel]="selectedDeviceObj" (ngModelChange)="onChangeObj($event)" name="sel3">
  <option [ngValue]="i" *ngFor="let i of deviceObjects">{{i.name}}</option>
</select>
{{selectedDeviceObj | json}}
export class AppComponent {
  deviceObjects = [{name: 1}, {name: 2}, {name: 3}];
  selectedDeviceObj = this.deviceObjects[1];
  onChangeObj(newObj) {
    console.log(newObj);
    this.selectedDeviceObj = newObj;
    // ... do other stuff here ...
  }
}

Plunker-使用しない<form>
Plunker- <form>新しいフォームAPIを使用および使用する


anwereは正しいですが、ここでngModelの役割は何ですかmまだ混乱していますか?
Pardeep Jain

1
@ PardeepJain、NgModelで双方向データバインディングを使用すると、Angularは1)selectedDeviceユーザーが別のアイテムを選択したときに自動的に更新されます。2)の値を設定するとselectedDevice、NgModelは自動的にビューを更新します。変更の通知も受け取りたいので、(change)イベントバインディングを追加しました。このようにする必要はありません...双方向のデータバインディングをに分割できるはずです[ngModel]="selectedDevice" and (ngModelChange)="onChange($event)"が、私が知ってonChange()いるように、そのように選択リストが変更されるたびに2回呼び出されます。
Mark Rajcok、2015

よろしくお願いします。私は値を取得したいのですが<option *ngFor="#course of course_array #i=index" #newone value={{course.id}} >{{course.course_name}}</option> course.course_namecourse.id両方とも(change)関数を介してこれら2つをどのように送信できますか?
Pardeep Jain

1
@HongboMiao、特殊$event変数/記号は、Angularテンプレートステートメントが持つ「ステートメントコンテキスト」の一部です。代わりに私が書いた場合は(ngModelChange)="onChange('abc')"、その後newValueの文字列を取得しますabc。これは通常のJavaScript関数呼び出しです。
Mark Rajcok

2
@HongboMiao、オブジェクトの配列がある場合は[ngValue]を使用します。プリミティブ型(文字列、ブール値、整数)の配列がある場合は、[値]を使用します。
Mark Rajcok、

40

selectタグで参照変数を作成し、#deviceそれを変更ハンドラーに渡すことで、コンポーネントに値を戻しonChange($event, device.value)、新しい値にする必要があります。

<select [(ng-model)]="selectedDevice" #device (change)="onChange($event, device.value)">
    <option *ng-for="#i of devices">{{i}}</option>
</select>

onChange($event, deviceValue) {
    console.log(deviceValue);
}

1
ngModelここにバインドするのではなく、という新しい変数にバインドしますdevice
lux

4
いただきました!の巻[(ngModel)]こちら
Pardeepジャイナ

2
@Broccoあなたとマークの両方が正しいです。あなたが理解できるといいのですが、私は1つの回答しか選択できません。:)
Hongbo Miao

22

[値]の代わりに[ngValue]を使用してください!!

export class Organisation {
  description: string;
  id: string;
  name: string;
}
export class ScheduleComponent implements OnInit {
  selectedOrg: Organisation;
  orgs: Organisation[] = [];

  constructor(private organisationService: OrganisationService) {}

  get selectedOrgMod() {
    return this.selectedOrg;
  }

  set selectedOrgMod(value) {
    this.selectedOrg = value;
  }
}


<div class="form-group">
      <label for="organisation">Organisation
      <select id="organisation" class="form-control" [(ngModel)]="selectedOrgMod" required>
        <option *ngFor="let org of orgs" [ngValue]="org">{{org.name}}</option>
      </select>
      </label>
</div>

1
これは私を助けました。私のケースが少し異なるかどうかは(change)="selectOrg(selectedOrg)"わかりませんが、私にとっては、新しく選択されたオプションではなく、現在/前の選択で関数selectOrgを呼び出します。私は理解しました、私は(change)少しも必要としません。
ニック

良いスポッティング。はい、古いモデルを渡す(変更する)とは奇妙な動作です。ng-changeのようなものだと思っていました。これはおそらくangular2のバグです。getメソッドとsetメソッドを使用するように更新しました。そうすれば、set selectedOrgMod(value)メソッドで、組織が変更されたことがわかり、組織チームのリストが更新されます。
ロバートキング

12

https://angular.io/docs/ts/latest/guide/forms.htmlで Angular 2フォームチュートリアル(TypeScriptバージョン)を実行中にこの問題に遭遇しました

選択/オプションブロックでは、オプションの1つを選択して、選択の値を変更できませんでした。

Mark Rajcokが提案したことを行うとうまくいきましたが、元のチュートリアルで見逃したものがあるのか​​、または更新があったのかと思います。いずれにせよ、追加

onChange(newVal) {
    this.model.power = newVal;
}

HeroFormComponentクラスのhero-form.component.tsに

そして

(change)="onChange($event.target.value)"

<select>要素のhero-form.component.htmlに追加すると機能します


4

角度6以上でselectionChangeを使用します。例 (selectionChange)= onChange($event.value)


私はリアクティブフォームアプローチを使用しませんでした。その単一の値に基づいてサービスコールをトリガーするために選択した値が必要なだけです。上記の方法が役立ちました。
anavaras lamurep

3

別のオプションは、オブジェクトを文字列として値に格納することです。

<select [ngModel]="selectedDevice | json" (ngModelChange)="onChange($event)">
    <option [value]="i | json" *ngFor="let i of devices">{{i}}</option>
</select>

成分:

onChange(val) {
    this.selectedDevice = JSON.parse(val);
}

これは、ページの読み込み時に選択値を設定するために双方向バインディングを機能させる唯一の方法でした。これは、選択ボックスに入力する私のリストが、選択がバインドされたものとまったく同じオブジェクトではなく、同じプロパティ値だけでなく、同じオブジェクトである必要があるためです。


3
<mat-form-field>
<mat-select placeholder="Vacancies" [(ngModel)]="vacanciesSpinnerSelectedItem.code" (ngModelChange)="spinnerClick1($event)"
    [ngModelOptions]="{standalone: true}" required>
    <mat-option *ngFor="let spinnerValue of vacanciesSpinnerValues" [value]="spinnerValue?.code">{{spinnerValue.description}}</mat-option>
</mat-select>

これを角度のあるマテリアルドロップダウンに使用しました。正常に動作します


1

最新のionic 3.2.0が(ionChange)に変更(変更)されました

例:HTML

<ion-select (ionChange)="function($event)"> <ion-option>1<ion-option>
</ion-select>

TS

function($event){
// this gives the selected element
 console.log($event);

}

1

角度7/8

angular 6以降、角度の7+では、反応型フォームディレクティブでのngModel入力プロパティの使用は廃止され、完全に削除されました。ここで公式ドキュメントを読んでください。

リアクティブフォームアプローチを使用すると、選択したデータを取得/設定できます。

      //in your template
 <select formControlName="person" (change)="onChange($event)"class="form-control">
    <option [value]="null" disabled>Choose person</option>
      <option *ngFor="let person of persons" [value]="person"> 
        {{person.name}}
    </option>
 </select> 


 //in your ts
 onChange($event) {
    let person = this.peopleForm.get("person").value
    console.log("selected person--->", person);
    // this.peopleForm.get("person").setValue(person.id);
  }

0

では角度5 Iは、以下の方法で行いました。オブジェクトの取得$のevent.valueをするのではなく、$ event.target.value

<mat-form-field color="warn">
   <mat-select (ngModelChange)="onChangeTown($event)" class="form-width" formControlName="branch" [(ngModel)]="branch" placeholder="Enter branch">
     <mat-option *ngFor="let branch of branchs" [value]="branch.value">
                  {{ branch.name }}
     </mat-option>
   </mat-select>
</mat-form-field>

onChangeTown(event): void {
  const selectedTown = event;
  console.log('selectedTown: ', selectedTown);
}

0

Angular 8では、「selectionChange」を次のように使用するだけです:

 <mat-select  [(value)]="selectedData" (selectionChange)="onChange()" >
  <mat-option *ngFor="let i of data" [value]="i.ItemID">
  {{i.ItemName}}
  </mat-option>
 </mat-select>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.