このようなフォームと基礎となるモデルがあります
コンポーネントから
myTextModel: string;
updateMyTextModel(): void {
this.myTextModel = "updated model value";
//todo- set form dirty (or invalid or touched) here
}
HTMLテンプレート
<form #testForm="ngForm" id="testForm">
<input type="text" id="myText" [(ngModel)]="myTextModel" name="myText" #myText="ngModel">
</form>
<button (click)="updateMyTextModel()">Update myTextModel</button>
<div *ngIf="testForm.dirty">testForm diry</div>
<div *ngIf="testForm.touched">testForm touched</div>
コードに触れた、または汚れたフォームを設定するにはどうすればよいですか?
注:この例では、ボタンを使用してモデルの変更をトリガーしますが、Web API非同期要求からのコールバックなど、他の方法でモデルを更新することもあります。
解決:
//our root app component
import {Component, NgModule, VERSION} from '@angular/core'
import {BrowserModule} from '@angular/platform-browser'
import { Component, ViewChild } from '@angular/core';
import { FormsModule } from '@angular/forms';
@Component({
selector: 'my-app',
template: `
<form #testForm="ngForm" id="testForm">
<input type="text" id="myText" [(ngModel)]="myTextModel" name="myText" #myText="ngModel">
</form>
<button (click)="updateMyTextModel()">Update myTextModel</button>
<div *ngIf="testForm.dirty">testForm diry</div>
<div *ngIf="testForm.touched">testForm touched</div>
`,
})
export class App {
@ViewChild('testForm') test: any;
updateMyTextModel(){
this.test.control.markAsTouched();
this.test.control.markAsDirty();
}
constructor() {
console.log(this.test);
}
}
@NgModule({
imports: [ BrowserModule,FormsModule ],
declarations: [ App ],
bootstrap: [ App ]
})
export class AppModule {}
Plunkrの動作:
リアクティブフォーム(FormGroup
)を使用しない理由、
_let testForm = new FormGroup({
myText: new FormControl('initial value')
})
<form [formGroup]="testForm">
<input type="text" formControlName="myText">
</form>
<button (click)="updateMyTextModel()">Update myTextModel</button>
<div *ngIf="testForm.dirty">testForm diry</div>
<div *ngIf="testForm.touched">testForm touched</div>
_
関数では、任意の条件に基づいて markAsDirty()
を使用できます。
_updateMyTextModel(): void {
this.myTextModel = "updated model value";
if ( // some condition ) {
this.testForm.markAsDirty();
}
}
_
個々のフォームコントロールをダーティ/タッチとして設定するには、次を使用できます。
_this.testForm.get('myText').markAsDirty();
this.testForm.get('myText').markAsTouched();
_
これは動作するはずです:
@ViewChild('testForm') testForm;
updateMyTextModel(): void {
this.myTextModel = "updated model value";
this.myForm.form.markAsDirty();
}
このようなものを介してNgForm
form refを使用する場合-
@ViewChild('viewChildForm') public viewChildForm: NgForm;
および_.ts
_ファイルでプログラムでフォームを変更してみてください:
フォームを無効に設定するには:this.viewChildForm.form.setErrors({ 'invalid': true });
。
から有効に設定するには:this.viewChildForm.form.setErrors(null);
フォーム内のすべての入力フィールドをループして、タッチまたはダーティをマークする必要がある場合:
onSubmit(nameForm)
{
let inputAryVar = nameForm.form.controls
for(let keyVar in inputAryVar)
{
inputAryVar[keyVar].markAsTouched();
inputAryVar[keyVar].markAsDirty();
}
}