Angular 2 プロパティ バインディングで非常に奇妙な動作をしています。
まず、これは Store クラスです。
export class Store {
id: number;
name: string;
address: string;
}
これはコンポーネント コードです。
export class MyBuggyComponent implements OnInit {
stores: Store[];
selectedStore: any;
error: any;
constructor(private myDataService: MyDataService) { }
ngOnInit() {
this.myDataService.getStores().subscribe(
stores => this.stores = stores,
error => { this.error = error; console.log(this.error); });
}
selectionChanged(value: any){
console.log("DEBUG: " + value);
}
}
そして、これが私を夢中にさせるテンプレートです!
<form>
<div class="form-group">
<label for="store">Select store:</label>
<select class="form-control custom-select" id="store" name="store" required
[(ngModel)]="selectedStore" (change)="selectionChanged($event.target.value)">
<option *ngFor="let s of stores" [value]="s">{{s.name}}</option>
</select>
<small class="form-text text-muted" *ngIf="selectedStore">Address: {{selectedStore.address}}</small>
</div>
</form>
[value]="s"
ここではoption
ofタグのバインディングが<select>
機能しません! 空のオブジェクト (?)に設定し、タグにselectedStore
空のAddress:
テキストを表示し、ログに記録します: コンソール (で)。ただし、補間は期待どおりに機能します(選択ボックス内に名前が表示されます)。<small>
DEBUG: [object Object]
selectionChanged()
{{s.name}}
これを見てください: テンプレートに次の変更を加えると、期待どおりに動作します:
<option *ngFor="let s of stores" [value]="s.address">{{s.name}}</option>
</select>
<small class="form-text text-muted" *ngIf="selectedStore">Address: {{selectedStore}}</small>
これでバインドが機能し、アドレスがコンソールに記録され、<small>
タグにも適切に表示されます。そのため、バインディング[value]="s"
は機能しません (実際には奇妙な「オブジェクト」値が返されます) が、バインディング[value]="s.address"
は期待どおりに機能します。私はドキュメントに従いましたが、そのような制限については言及されていません。これはバグですか?または、何か不足していますか?