Angular 2で送信した後にフォームをクリアするにはどうすればよいですか?


88

テンプレート付きの単純なAngular2コンポーネントがいくつかあります。送信後にフォームとすべてのフィールドをクリアする方法は?ページをリロードできません。date.setValue('')フィールドを設定した後のデータはstiltouchedです。

import {Component} from 'angular2/core';
import {FORM_DIRECTIVES, FormBuilder, ControlGroup, Validators, Control} from 'angular2/common';

@Component({
    selector: 'loading-form',
    templateUrl: 'app/loadings/loading-form.component.html',
    directives: [FORM_DIRECTIVES]
})

export class LoadingFormComponent {
    private form:ControlGroup;
    private date:Control;
    private capacity:Control;

    constructor(private _loadingsService:LoadingsService, fb:FormBuilder) {
        this.date = new Control('', Validators.required);
        this.capacity = new Control('', Validators.required);
        this.form = fb.group({
            'date': this.date,
            'capacity': this.capacity
        });
    }

    onSubmit(value:any):void {
        //send some data to backend
    }
}

Loading-form.component.html

<div class="card card-block">
    <h3 class="card-title">Loading form</h3>

    <form (ngSubmit)="onSubmit(form.value)" [ngFormModel]="form">
        <fieldset class="form-group" [class.has-danger]="!date.valid && date.touched">
            <label class="form-control-label" for="dateInput">Date</label>
            <input type="text" class="form-control form-control-danger form-control-success" id="dateInput"
                   min="0" placeholder="Enter loading date"
                   [ngFormControl]="form.controls['date']">
        </fieldset>
        <fieldset class="form-group" [class.has-danger]="!capacity.valid && capacity.touched">
            <label class="form-control-label" for="capacityInput">Capacity</label>
            <input type="number" class="form-control form-control-danger form-control-success" id="capacityInput"
                   placeholder="Enter capacity"
                   [ngFormControl]="form.controls['capacity']">
        </fieldset>
        <button type="submit" class="btn btn-primary" [disabled]="!form.valid">Submit
        </button>
    </form>
</div>

回答:


138

https://angular.io/docs/ts/latest/guide/reactive-forms.html(セクション「フォームフラグのリセット」)も参照してください。

> = RC.6

RC.6では、フォームモデルの更新がサポートされている必要があります。新しいフォームグループを作成し、に割り当てるmyForm

[formGroup]="myForm"

また、サポートされます(https://github.com/angular/angular/pull/11051#issuecomment-243483654

> = RC.5

form.reset();

新しいフォームモジュール(> = RC.5)NgFormにはreset()メソッドがあり、フォームresetイベントもサポートしています。 https://github.com/angular/angular/blob/6fd5bc075d70879c487c0188f6cd5b148e72a4dd/modules/%40angular/forms/src/directives/ng_form.ts#L179

<= RC.3

これは機能します:

onSubmit(value:any):void {
  //send some data to backend
  for(var name in form.controls) {
    (<Control>form.controls[name]).updateValue('');
    /*(<FormControl>form.controls[name]).updateValue('');*/ this should work in RC4 if `Control` is not working, working same in my case
    form.controls[name].setErrors(null);
  }
}

も参照してください


2
@ masel.popowoはい、必要に応じてpristine、...、フォームの再構築が現在のところ唯一のオプションです。
ギュンターZöchbauer

@günter-zöchbauerフォームをどのように再構築しますか?
SimonHawesome 2016年

2
まだ自分で試したことはありませんが、コントロールグループを削除して新しいコントロールグループを作成するだけだと思います。コードを関数に移動して、必要に応じて繰り返し呼び出すことができるようにします。
ギュンターZöchbauer

setErrors()の場合は+1。ちなみに、私がここに書いた間違いは、他の誰かが同様のことをした場合に私が犯した間違いです。プレースホルダーを使用する場合、たとえば「foo」はcontrol.updateValue( 'foo')を呼び出さず、代わりにcontrol.setValue(null)を呼び出します。
Mike Argyriou 2016年

setValue()制御の方法がわかりません。のみupdateValue() github.com/angular/angular/blob/master/modules/angular2/src/...
ギュンターZöchbauer

34

Angular2 RC5の時点で、うまくいくmyFormGroup.reset()ようです。


これはAngular4で機能し、フォームの検証をリセットするために使用されました
Grim

13

送信後にフォームをリセットするには、を呼び出すだけですthis.form.reset()。それを呼び出すreset()ことによって:

  1. コントロールと子コントロールを元の状態としてマークします。
  2. コントロールと子コントロールを手つかずとしてマークします。
  3. コントロールと子コントロールのカスタム値またはnullに設定します
  4. 影響を受ける当事者の値/有効性/エラーを更新します

詳細な回答については、このプルリクエストをご覧ください。参考までに、このPRはすでに2.0.0に統合されています。

うまくいけば、これがお役に立てば幸いです。Angular2フォームに関して他にご不明な点がありましたらお知らせください。


1
リセットを使用すると、検証は適用されません。両方を機能させるにはどうすればよいですか?
nisha 2018

11

clearForm();.tsファイルで電話をかける

以下のサンプルコードスニペットのように、フォームデータをクリアしてみてください。

clearForm() {

this.addContactForm.reset({
      'first_name': '',
      'last_name': '',
      'mobile': '',
      'address': '',
      'city': '',
      'state': '',
      'country': '',
       'zip': ''
     });
}

9
import {Component} from '@angular/core';
import {NgForm} from '@angular/forms';
@Component({
    selector: 'example-app',
    template: '<form #f="ngForm" (ngSubmit)="onSubmit(f)" novalidate>
        <input name="first" ngModel required #first="ngModel">
        <input name="last" ngModel>
        <button>Submit</button>
    </form>
    <p>First name value: {{ first.value }}</p>
    <p>First name valid: {{ first.valid }}</p>
    <p>Form value: {{ f.value | json }}</p>
    <p>Form valid: {{ f.valid }}</p>',
})
export class SimpleFormComp {
    onSubmit(f: NgForm) {

        // some stuff

        f.resetForm();
    }
}

@これは、すべてのフィールドをクリアする必要がある場合に正常に機能します。しかし、特定のフィールドのみをクリアするために同じことをどのように実装できますか?
AkhileshPothuri19年

9

これがAngular7.3でのやり方です

// you can put this method in a module and reuse it as needed
resetForm(form: FormGroup) {

    form.reset();

    Object.keys(form.controls).forEach(key => {
      form.get(key).setErrors(null) ;
    });
}

電話する必要はありませんでした form.clearValidators()


2
これは、バリデーターを備えたコントロールを持つFormBuilderで構築されたフォームをクリアするための最良の(そして私にとってのみ機能する)ソリューションです。
mmied

8

これが私がそれを行う方法ですAngular8:

フォームのローカル参照を取得します。

<form name="myForm" #myForm="ngForm"></form>
@ViewChild('myForm', {static: false}) myForm: NgForm;

また、フォームをリセットする必要があるときはいつでも、resetFormメソッドを呼び出します。

this.myForm.resetForm();

あなたが必要になりますFormsModuleから、@angular/formsそれを動作させるために。必ずモジュールのインポートに追加してください。


1
@ViewChildAngular8では2つの引数が必要です。@ViewChild('myForm', {static: false}) myForm: NgForm;
タンジール

6

Angularバージョン4では、これを使用できます。

this.heroForm.reset();

ただし、次のような初期値が必要になる場合があります。

ngOnChanges() {
 this.heroForm.reset({
  name: this.hero.name, //Or '' to empty initial value. 
  address: this.hero.addresses[0] || new Address()
 });
}

オブジェクト参照のnull問題を解決することが重要です。

参照リンク、「フォームフラグのリセット」を検索します。


ありがとう、それは私のために働いています。これが私が欲しいものです。
DhavalMistry20年


1

私は別の解決策を見つけました。少しハッキーですが、angular2の世界で広く利用できます。

* ngIfディレクティブはフォームを削除して再作成するため、フォームに* ngIfを追加して、ある種のformSuccessfullySent変数にバインドするだけです。=>これによりフォームが再作成されるため、入力制御ステータスがリセットされます。

もちろん、モデル変数もクリアする必要があります。フォームフィールドに特定のモデルクラスがあると便利だと思いました。このようにして、このモデルクラスの新しいインスタンスを作成するのと同じくらい簡単にすべてのフィールドをリセットできます。:)


追加:私はAngularDartを使用していますが、このリセットメソッドはまだありません。または、少なくとも私は今それを発見しませんでした。:D
ベンジャミンイエズス会2016

RC.6では、フォームモデルを再初期化するだけで十分です。フォームモデルの作成をメソッドに移動した場合、このメソッドを呼び出すとフォームがリセットされます。
ギュンターZöchbauer

@GünterZöchbauerすごい!Angular2 for Dartにもこの機能があるのが待ちきれません!:)問題としての私のアプローチのため:フォームにすべての入力要素のリストがあります。私はこれらをdart-native経由で取得querySelectorAllngAfterViewInitます。フォームを送信する代わりに、このリストを使用して、次の入力要素をkeydown.enterにフォーカスします。ngIfを使用してフォームを再初期化すると、このリストは壊れます。:(
ベンジャミンイエズス会2016

OK、問題を修正しました。フォームモデルをリセットするときに、InputElementインスタンスを再クエリできます。
ベンジャミンイエズス会2016

0

うーん、今(2017年1月23日角度2.4.3)私はそれを次のように動作させました:

newHero() {
    return this.model = new Hero(42, 'APPLIED VALUE', '');
}
<button type="button" class="btn btn-default" (click)="heroForm.resetForm(newHero())">New Hero</button>

0

以下のコードはAngular4で機能します

import { FormBuilder, FormGroup, Validators } from '@angular/forms';
export class RegisterComponent implements OnInit {
 registerForm: FormGroup; 

 constructor(private formBuilder: FormBuilder) { }   

 ngOnInit() {
    this.registerForm = this.formBuilder.group({
      empname: [''],
      empemail: ['']
    });
 }

 onRegister(){
    //sending data to server using http request
    this.registerForm.reset()
 }

}

0

this.myForm.reset();

これで十分です...目的の出力を得ることができます


1
このコード行が問題をどのように解決するかについての説明を追加してください
Sfili_81Jan

0

送信時にフォーム全体をリセットするには、Angularでreset()を使用できます。以下の例はAngular8で実装されています。以下は、電子メールを入力として受け取る購読フォームです。

<form class="form" id="subscribe-form" data-response-message-animation="slide-in-left" #subscribeForm="ngForm"
(ngSubmit)="subscribe(subscribeForm.value); subscribeForm.reset()">
<div class="input-group">
   <input type="email" name="email" id="sub_email" class="form-control rounded-circle-left"
      placeholder="Enter your email" required ngModel #email="ngModel" email>
   <div class="input-group-append">
      <button class="btn btn-rounded btn-dark" type="submit" id="register"
         [disabled]="!subscribeForm.valid">Register</button>
   </div>
</div>
</form>

公式ドキュメントを参照してください:https//angular.io/guide/forms#show-and-hide-validation-error-messages


-3
resetForm(){
    ObjectName = {};
}

このコードは質問に答えるかもしれませんが、問題を解決する理由/方法を示す説明を追加する必要があります。
BDL 2017年

'touched'、 'pristine'などのクラスを元の値に戻すことはありません。
pac0 2017年

@Shivendraこれは特に問題に対しては機能するかもしれませんが、一般的ではありません。あなたはあなたをobject空にしているのであって、ではありませんform
タンジール
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.