私の角(4 + Typescript)プロジェクトの中で私はすでに準備されたコンポーネントを使っていました(ControlValueAccessorを拡張する方法は同じなのですが、 ng2-select)は、より良いUXとより良い外観のために欲しかった。それを私が見た反応的なフォームを使用している私のフォームコンポーネントに含めた後、私は、フォームのコントロールのために、選択されたアイテムを管理するために準備されたコンポーネントの内部で使用されるクラスSelectItemに基づいてオブジェクトを取得します。提出と値の変更の角度4 ControlValueAccessorの値
// console.log(this.myForm.values)
Object {
txtInput: 'value',
// ...
preparedComponent: SelectItem { // <--
id: '1',
text: 'Chosen item'
}
}
コンポーネントは基本的に標準の選択制御のためだけの交換であるので、私は、文字列として形成された選択項目のIDが返されますことを期待していた - このように:私の後
// console.log(this.myForm.values)
Object {
txtInput: 'value',
// ...
preparedComponent: '1' // <--
}
を実際にControlValueAccessorが何であるかを学び、それがどのように機能するか、私は提出時に戻ってくるものの方法を変更しました(あるいは、項目変更 - onChange
)を項目のIDに追加します。この問題は、(インスタンスの追加時に)空の値の代わりにフォームのコントロールに事前定義された値を設定する(インスタンスの編集時に)まで、しばらくの間解決されました。今回は、writeValue
が、定義済みの値として送信された内容に基づいてフォームコントロールに値を割り当てていることがわかりました。だから... ...私は
Object {
id: '1',
text: 'Chosen item'
}
...として所定の値を送信した場合に、これはまた、単に上記の最初のコード例のように提出上のオブジェクトの値でした。私はwriteValue
が呼び出された直後に、onChange
で制御に正しい値を割り当てるためにこれを回避する方法を作った。これは実際にそれをやっての不適切な方法でしたが、私はそれ以外のものを考え出したことができませんでした:
public writeValue(val: any): void {
this.selectedItems = val; // val is for example Object { id: '1', text: 'Chosen item' }
setTimeout(() => {
this.onChange(val.id); // just an example of emitted value, there should be some checks val is object and id exists in real code
}, 0);
}
そしてまた、私の知る限り、コントロールのvalueChanges
を形成するためにサブスクライブして起動しなかったとして働いていたことを。問題は、準備されたコンポーネントにあらかじめ定義された値を割り当てるたびに、{ emitEvent: false }
を使用していても、サブミット後に使用された値が放出されることです。
これは、準備されたコンポーネントで何らかの形で処理したいことです。送信時に適切な値を取得したいからです。値が実際に変更されていない限り、サブスクライバに変更を送信したくありません。あらかじめ定義された値として置き換えられます。どのようにこれを処理するか考えていただければ幸いです。
私はちょっとこの正確なプロセスを行った。私はあなたが持っている正確な問題を理解しているかどうかは確かではありません。 – Amit
問題は主に 'writeValue'の中の' onChanges'です。最初は 'setTimeout'が実際に回避策としてやっていた最後のもので、第2に、定義済みの値で初期化されたときに変更イベントが発生するからです。理想的には入力と出力の値が分離されます。入力はオブジェクトを受け取り、出力は選択されたオブジェクトのIDを返します。したがって、デフォルトの動作として期待されるものではないので、値の初期化時に変更を発行する必要はありません( '{emitEvent:false} 'の場合は' setValue'の 'set'に' reset'を指定します)Angularはイベントを送出しません時chaning値)。 – user1257255
ng2-select(btwはほとんど維持されていません) "fighting" – Amit