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 for new selectedDevice, but what I
// got here is always last selection, not the one I just select.
}
双方向のデータバインディングが不要な場合
<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
がオブジェクトの配列の場合は、ngValue
ではなくvalue
にバインドします。
<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 ...
}
}
選択タグ#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);
}
[値]の代わりに[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>
https://angular.io/docs/ts/latest/guide/forms.html でAngular 2フォームチュートリアル(TypeScriptバージョン)を実行しているときにこの問題に遭遇しました。
Select/optionブロックは、オプションの1つを選択することによって選択の値を変更することを許可していませんでした。
元のチュートリアルで見逃したことがあるのか、それともアップデートがあったのか、疑問に思いますが、Mark Rajcokが提案したことを実行してもうまくいきました。いずれにせよ、追加
onChange(newVal) {
this.model.power = newVal;
}
heroFormComponentクラスのhero-form.component.tsに追加します。
そして
(change)="onChange($event.target.value)"
<select>
要素のhero-form.component.htmlに追加
もう1つのオプションは、オブジェクトを値として文字列として格納することです。
<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);
}
これが、ページ読み込み時にselect値を設定するために双方向バインディングが機能する唯一の方法です。これは、選択ボックスに入力するリストが、選択したものとまったく同じオブジェクトではなく、同じプロパティ値ではなく、同じオブジェクトである必要があるためです。
<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>
これを角度のあるマテリアルドロップダウンに使用しました。正常に動作します
最新のイオン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);
}
角度6以上ではselectionChangeを使用してください。例(selectionChange)= onChange($event.value)
Angular 5 では、次のようにしました。 $ event.target.valueの代わりにオブジェクト$ event.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);
}