フォーム内で *ngIf と ngFormModel の両方を使用してフォームを検証するのに苦労しています。
ユースケースは次のとおりです。ユーザー入力に基づいて、フォーム内の特定のフィールドを非表示または無効にします。ただし、これらの入力が表示される場合は、検証する必要があります。
基本的な検証のみが必要な場合は、何らかの方法で行うことができます:
- 入力のみが必要な場合は、 と を使用して A-OK で動作し
ngControl
ますrequired
- 特定の形式が必要な場合は、
pattern
属性を使用できます。Angular ではありませんが、機能します。
しかし、より複雑な検証を実装するために、カスタム チェックを使用するようにngControl
結合を使用しようとしています。ngFormModel
次のページにあるコードを使用しました。
angular2(およびそこで参照されているリンク)にフォーム検証パターンを追加する方法
Angular2 フォーム: 検証、ngControl、ngModel など
私のコードは次のとおりです。
HTML
<div>
<h1>Rundown of the problem</h1>
<form (ngSubmit)="submitForm()" #formState="ngForm" [ngFormModel]="myForm">
<div class="checkbox">
<label>
<input type="checkbox" [(ngModel)]="model.hideField" ngControl="hideField"> Is the input below useless for you ?
</label>
</div>
<div *ngIf="!model.hideField">
<div class="form-group">
<label for="optionalField">Potentially irrelevant field </label>
<input type="text" class="form-control" [(ngModel)]="model.optionalField" ngControl="optionalField" required #optionalField="ngForm">
<div [hidden]="optionalField.valid || optionalField.pristine" class="alert alert-warning">
This input must go through myCustomValidator(), so behave.
</div>
</div>
</div>
<button type="submit" class="btn btn-primary" [disabled]="!formState.form.valid">I can't be enabled without accessing the input :(</button>
<button type="submit" class="btn btn-default">Submit without using form.valid (boo !)</button>
</form>
</div>
タイプスクリプト
import {Component, ChangeDetectorRef, AfterViewInit } from 'angular2/core';
import {NgForm, FormBuilder, Validators, ControlGroup, FORM_DIRECTIVES} from 'angular2/common';
@Component({
selector: 'accueil',
templateUrl: 'app/accueil.component.bak.html',
directives:[FORM_DIRECTIVES],
providers: [FormBuilder]
})
export class AccueilComponent implements AfterViewInit {
private myForm: ControlGroup;
model: any;
constructor(fb: FormBuilder, cdr: ChangeDetectorRef) {
this.cdr = cdr ;
this.model = {} ;
this.myForm = fb.group({
"hideField": [false],
"optionalField": [this.model.optionalField, Validators.compose([this.myCustomValidator])]
});
}
ngAfterViewInit() {
// Without this, I get the "Expression has changed after it was checked" exception.
// See also : https://stackoverflow.com/questions/34364880/expression-has-changed-after-it-was-checked
this.cdr.detectChanges();
}
submitForm(){
alert("Submitted !");
}
myCustomValidator(optionalField){
// Replace "true" by "_someService.someCheckRequiringLogicOrData()"
if(true) {
return null;
}
return { "ohNoes": true };
}
}
*ngIf を使用して入力がテンプレートから削除された場合でも、コンストラクターは引き続きコントロールを参照しています。当然のことながら INVALID であるため、[disabled]="!formState.form.valid" を使用できなくなりmyForm
ます。
Angular 2 を使用して私が目指していることは可能ですか? これは珍しいユースケースではないと確信していますが、私の現在の知識では、どうすればそれを機能させることができるかわかりません。
ありがとう !