反応しやすいフォームでパイプを使用する際に問題が発生しています。オブジェクトを配列に変換して*ngFor
と一緒に使用できるパイプがあります。リアクティブフォームでの各コントロールの変更に対するパイプ更新
これまでのところは良い...問題は、私は私の*ngFor
内(値をバインドするフォームコントロールを使用して)入力を作成するときに、この入力の各変化は、パイプの更新をトリガーするということです。その結果、入力に1文字を書くたびに入力がフォーカスを失うことになります。
HTML:
<form [formGroup]="myForm" novalidate (ngSubmit)="save(myForm.value, myForm.valid)">
<div *ngFor="let item of myForm.controls.object.value | keys" formGroupName='object'>
<label>{{lang}}</label>
<input name="item" type="text" placeholder="Option" [formControlName]="item.key"/>
</div>
</form>
そして、私のパイプ:ここ
import { Pipe, PipeTransform } from '@angular/core';
@Pipe({
name: 'keys'
})
export class KeysPipe implements PipeTransform {
transform(value, args:string[]) : any {
if (!value) {
return value;
}
let keys = [];
for (let key in value) {
keys.push({key: key, value: value[key]});
}
return keys;
}
}
は、問題を実証するplunkerです。
パイプとは別の方法を書いていますが、使用することができますか?
私は私のオブジェクトを変更することはできませんのでご注意、それが不明なプロパティ(plunker例でitem1
とitem2
)
'trackByIdy'(' trackByIdx')にタイプミスがあります。ところで、外部関数を参照するのではなく、インデックス( 'trackBy'内)を直接使用する方法はありますか? – ncohen
そうは思わない。関数の代わりに(itemの)プロパティ名を使用できるようにするプル要求がありますが、プリミティブ値に対しては機能しません。これを回避するもう1つの方法は、オブジェクトに値をラップすることです。次に、 'trackBy'は必要ありません –