入力を含まないカスタムコントロールを作成したいと思います。コントロールが変更されるたびに、完全なフォームを保存します。入力なしのカスタムコントロールで角型でchange()をトリガする方法
我々の現在のアプローチは、次のようにフォーム変更イベントを使用しています:
<form #demoForm="ngForm" (change)="onChange()">
<custom-input name="someValue" [(ngModel)]="dataModel">
</custom-input>
</form>
あなたが見ることができるように、我々は、フォームの変化に反応して「変更」-eventを使用しています。 入力、チェックボックス、...がコントロールである限り、これは問題なく動作します。
私たちのカスタムコントロールは、私たちがクリックできる単純なdivの中にのみ存在します。 divをクリックするたびにコントロールの値が1ずつ増加しますが、フォームの「変更」 - イベントは発生しません。どういうわけか私のカスタムコントロールをフォームにリンクする必要がありますか?または、解雇される必要のあるイベントはありますか?
私は、問題を実証するためのplunker作成しましたimport { Component, forwardRef } from '@angular/core';
import { NG_VALUE_ACCESSOR, ControlValueAccessor } from '@angular/forms';
@Component({
selector: 'custom-input',
template: `<div (click)="update()">Click</div>`,
providers: [{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => CustomInputComponent),
multi: true
}]
})
export class CustomInputComponent implements ControlValueAccessor {
private onTouchedCallback:() => void =() => {};
private onChangeCallback: (_: any) => void =() => {};
update(){
this.value++;
}
get value(): any {
return this.innerValue;
};
set value(v: any) {
console.log("Change to");
if (v !== this.innerValue) {
this.innerValue = v;
this.onChangeCallback(v);
}
}
writeValue(value: any) {
if (value !== this.innerValue) {
this.innerValue = value;
}
}
registerOnChange(fn: any) {
this.onChangeCallback = fn;
}
registerOnTouched(fn: any) {
this.onTouchedCallback = fn;
}
}
:あなたはモデルの値を「クリック」をクリックするたびに増加したが、何も出力がコンソール上に存在しない、変化とされて https://plnkr.co/edit/ushMfJfcmIlfP2U1EW6A
を-eventが実行されません...(changeイベントにリンクされたconsole.logがあります)
タグを追加するときに表示されるタグの抜粋には注意してください。 'angularjs'はAngularJS 1.xです。 'angular2'はAngular 2+です。 –
HTML5フォームには、フォームツリーの一部と見なされる非常に明確な定義済みの要素リストがあります。 'div'、' span'、 'table'などカスタム要素を含むこのリストにない要素は、HTML5形式の一部として扱われません。あなたのコンポーネントがテンプレートの 'div'ではなく' output'を使用していたとしても、あなたが期待するように動作しないかもしれません。基本的に、これは仕様に組み込まれていません。 – Claies