Angular 2には現在、フォームを元の状態に簡単にリセットする方法がないことがわかりました。私は、フォームフィールドをリセットする以下のような解決策を見つけました。
コントロールグループを削除してフォームを元の状態に戻すために新しいコントロールグループを作成する必要があることが示唆されています。私はこれを行うための最善の方法を考え出すのに苦労しています。フォーム構築を関数内でラップする必要があることは知っていますが、コンストラクター内でフォーム構築を実行するとエラーが発生します。
フォームを完全にリセットするためにコントロールグループを再構築するための最良の方法は何ですか?
class App {
name: Control;
username: Control;
email: Control;
form: ControlGroup;
constructor(private builder: FormBuilder) {
this.name = new Control('', Validators.required);
this.email = new Control('', Validators.required);
this.username = new Control('', Validators.required);
this.form = builder.group({
name: this.name,
email: this.email,
username: this.username
});
}
onSubmit(value: any): void {
// code that happens when form is submitted
// then reset the form
this.reset();
}
reset() {
for (let name in this.form.controls) {
this.form.controls[name].updateValue('');
this.form.controls[name].setErrors(null);
}
}
}
> = RC.6
フォームのリセットをサポートし、submitted
状態を維持します。
console.log(this.form.submitted);
this.form.reset()
または
this.form = new FormGroup()...;
importat update
バリデータのように、フォームが作成されたときの状態にフォームコントロールを設定するには、追加の測定が必要です。
フォームの表示部分(html)に、フォームを表示または非表示にするための*ngIf
を追加します。
<form *ngIf="showForm"
フォームのコンポーネント側(* .ts)でこれを行います。
showForm:boolean = true;
onSubmit(value:any):void {
this.showForm = false;
setTimeout(() => {
this.reset()
this.showForm = true;
});
}
これはより詳細な例です:
export class CreateParkingComponent implements OnInit {
createParkingForm: FormGroup ;
showForm = true ;
constructor(
private formBuilder: FormBuilder,
private parkingService: ParkingService,
private snackBar: MatSnackBar) {
this.prepareForm() ;
}
prepareForm() {
this.createParkingForm = this.formBuilder.group({
'name': ['', Validators.compose([Validators.required, Validators.minLength(5)])],
'company': ['', Validators.minLength(5)],
'city': ['', Validators.required],
'address': ['', Validators.compose([Validators.required, Validators.minLength(10)])],
'latitude': [''],
'longitude': [''],
'phone': ['', Validators.compose([Validators.required, Validators.minLength(7)])],
'pictureUrl': [''],
// process the 3 input values of the maxCapacity'
'pricingText': ['', Validators.compose([Validators.required, Validators.minLength(10)])],
'ceilingType': ['', Validators.required],
});
}
ngOnInit() {
}
resetForm(form: FormGroup) {
this.prepareForm();
}
createParkingSubmit() {
// Hide the form while the submit is done
this.showForm = false ;
// In this case call the backend and react to the success or fail answer
this.parkingService.create(p).subscribe(
response => {
console.log(response);
this.snackBar.open('Parqueadero creado', 'X', {duration: 3000});
setTimeout(() => {
//reset the form and show it again
this.prepareForm();
this.showForm = true;
});
}
, error => {
console.log(error);
this.showForm = true ;
this.snackBar.open('ERROR: al crear Parqueadero:' + error.message);
}
);
}
}
original <= RC.5フォームを作成するコードをメソッドに移動し、submitを処理した後にもう一度呼び出します。
@Component({
selector: 'form-component',
template: `
<form (ngSubmit)="onSubmit($event)" [ngFormModel]="form">
<input type="test" ngControl="name">
<input type="test" ngControl="email">
<input type="test" ngControl="username">
<button type="submit">submit</button>
</form>
<div>name: {{name.value}}</div>
<div>email: {{email.value}}</div>
<div>username: {{username.value}}</div>
`
})
class FormComponent {
name:Control;
username:Control;
email:Control;
form:ControlGroup;
constructor(private builder:FormBuilder) {
this.createForm();
}
createForm() {
this.name = new Control('', Validators.required);
this.email = new Control('', Validators.required);
this.username = new Control('', Validators.required);
this.form = this.builder.group({
name: this.name,
email: this.email,
username: this.username
});
}
onSubmit(value:any):void {
// code that happens when form is submitted
// then reset the form
this.reset();
}
reset() {
this.createForm();
}
}
Angular 2 Finalに、フォームをきれいにリセットする新しいAPIがあります。
@Component({...})
class App {
form: FormGroup;
...
reset() {
this.form.reset();
}
}
このAPIはフォームの値をリセットするだけでなく、フォームフィールドの状態をng-pristine
およびng-untouched
に戻します。
reset()
関数のみを呼び出した場合、フォームコントロールは元の状態に設定されません。 Android.ioのドキュメントにこの問題に対する解決策があります。
component.ts
active = true;
resetForm() {
this.form.reset();
this.active = false;
setTimeout(() => this.active = true, 0);
}
component.html
<form *ngIf="active">
私が正しい道を進んでいるかどうかはわかりませんが、次のform/submitタグを使用して、2.4.8に取り組んでいます。
<form #heroForm="ngForm" (ngSubmit)="add(newHero); heroForm.reset()">
<!-- place your input stuff here -->
<button type="submit" class="btn btn-default" [disabled]="!heroForm.valid">Add hero</button>
トリックをしているようで、フォームのフィールドを再び "pristine"に設定します。
フォームのAngular基本ガイドを読み、フォームの再設定のセクションに当たったとき、彼らが与える解決策に関して以下を読んだとき、私は非常に驚きました。
適切なフォームリセット機能を待つ間、これは一時的な回避策です。
私は個人的に彼らが提供した回避策がうまくいくかどうかテストしませんでした(私はそれがすると思います)が、私はそれがきちんとしていない、そして問題に取り組むよりよい方法がなければならないことを信じる。
FormGroup API (安定版としてマークされています)によると、既に 'reset'メソッドがあります。
私は以下を試しました。私のtemplate.htmlファイルで私は持っていた
<form (ngSubmit)="register(); registrationForm.reset();" #registrationForm="ngForm">
...
</form>
Form要素の中で、テンプレート参照変数 'registrationForm'を初期化し、それを ngForm Directive に初期化しました。これは「フォーム全体を管理する」ということです。これにより、reset()メソッドを含む、管理しているFormGroupのメソッドと属性にアクセスできました。
上記のようにこのメソッド呼び出しをngSubmitイベントにバインドすると、register()メソッドが完了した後でフォーム(元の状態、ダーティ状態、モデル状態などを含む)がリセットされます。デモではこれで問題ありませんが、実際のアプリケーションではあまり役に立ちません。
Register()メソッドがサーバーへの呼び出しを実行したとします。サーバーがすべてに問題がないと応答したことがわかったら、フォームをリセットします。このシナリオでは、コードを以下のように更新します。
私のtemplate.htmlファイルで:
<form (ngSubmit)="register(registrationForm);" #registrationForm="ngForm">
...
</form>
そして私のcomponent.tsファイルで:
@Component({
...
})
export class RegistrationComponent {
register(form: FormGroup) {
...
// Somewhere within the asynchronous call resolve function
form.reset();
}
}
メソッドに 'registrationForm'参照を渡すことで、実行したい時点でresetメソッドを呼び出すことができます。
これがどんな意味でも役立つことを願っています。 :)
注:このアプローチはAngular 2.0.0-rc.5に基づいています。
私は反応形を角度4で使っています、そしてこのアプローチは私のために働きます:
this.profileEditForm.reset(this.profileEditForm.value);
fundamentalsドキュメントの フォームフラグをリセットする を参照してください。
以下のフォーマットを使用してください。私にとっては完璧に動作します。たくさんの方法をチェックしましたが、これは完璧に動作します。<form (ngSubmit)="mySubmitHandler(); myNgForm.resetForm()" #myNgForm="ngForm"> .... </form>
誰かが使用できる特定のフォームコントロールだけをクリアしたい場合
formSubmit(){
this.formName.patchValue({
formControlName:''
//or if one wants to change formControl to a different value on submit
formControlName:'form value after submission'
});
}
私はGünterZöchbauerからの答えを同じような場合に使用しました、そしてそれは私にはぴったりでした、フォーム作成を関数に移して、ngOnInit()からそれを呼び出すこと。
説明のために、フィールドの初期化も含めて、このようにしました。
ngOnInit() {
// initializing the form model here
this.createForm();
}
createForm() {
let EMAIL_REGEXP = /^[^@]+@([^@\.]+\.)+[^@\.]+$/i; // here just to add something more, useful too
this.userForm = new FormGroup({
name: new FormControl('', [Validators.required, Validators.minLength(3)]),
city: new FormControl(''),
email: new FormControl(null, Validators.pattern(EMAIL_REGEXP))
});
this.initializeFormValues();
}
initializeFormValues() {
const people = {
name: '',
city: 'Rio de Janeiro', // Only for demonstration
email: ''
};
(<FormGroup>this.userForm).setValue(people, { onlySelf: true });
}
resetForm() {
this.createForm();
this.submitted = false;
}
スマートリセットのためのボタンをフォームに追加しました(フィールドの初期化)。
HTMLファイル(またはインラインテンプレート)の場合:
<button type="button" [disabled]="userForm.pristine" (click)="resetForm()">Reset</button>
最初にフォームをロードした後、またはリセットボタンをクリックした後、次のステータスになります。
FORM pristine: true
FORM valid: false (because I have required a field)
FORM submitted: false
Name pristine: true
City pristine: true
Email pristine: true
そして、単純なform.reset()が私たちのためにしない全てのフィールド初期化! :-)