2017-10-02 7 views
0

私はいくつかの簡単な検証でテストフォームを用意しました。私の妥当性確認は、提出書類の時間に完全に働いています。フォームを送信した後角形2でフォームを送信した後に検証をリセットする方法

HTML

<section> 
    <form (ngSubmit)="savePerson()" #personForm="ngForm"> 
     <div> 
     <label for="name">Name: </label> 
     <input type="text" name="name" [(ngModel)]="person.name" required #name="ngModel" > 
     <div [hidden]="name.valid || name.pristine" class="error"> 
      Name is required. 
     </div> 
     </div> 
     <div> 
     <label for="weight">Weight: </label> 
     <input type="number" name="weight" [(ngModel)]="person.weight" min="20" #weight="ngModel"> 
     </div> 
     <div *ngIf="weight.errors && (weight.dirty || weight.touched)" class="error"> 
     <p [hidden]="!weight.errors.min"> 
      Weight must be higher than a feather's. {{weight.value}} is way too low. 
     </p> 
     <p [hidden]="!weight.errors.max"> 
      Weight can't be higher than a Rancor's. {{weight.value}} is too high 
     </p> 
     </div> 
     <div> 
     <label for="height">Height: </label> 
     <input type="number" name="height" [(ngModel)]="person.height"> 
     </div> 
     <div> 
     <label for="profession">Profession: </label> 
     <select name="proffesion" [(ngModel)]="person.proffesion" #proffesion="ngModel" min=1> 
      <option [ngValue]="0">Select Proffession</option> 
      <option *ngFor="let p of allproffesion" [value]="p.id">{{p.title}}</option> 
     </select> 
     </div> 
     <div> 
     <p>{{message}}</p> 
     <button type="submit" [disabled]="!personForm.form.valid">Save</button> 
     </div> 
    </form> 
</section> 
<button (click)="gotoPeoplesList()">Back to peoples list</button> 

TS

export class AddPersonComponent { 
    person : Person = { id : 0, height : 0, weight : 0, name : "", proffesion : 0}; 
    message : String = ""; 
    allproffesion : Proffesion []; 
    constructor(private route: ActivatedRoute, private router: Router, private peopleService:PeopleService){ 
     this.getAllProffession(); 
    } 

    getAllProffession(){ 
     this.peopleService.getAllProffession().subscribe(i=>this.allproffesion = i); 
    } 
    gotoPeoplesList(){ 
     let link = ['/'];  
     this.router.navigate(link); 
    } 

    savePerson(){ 
     this.peopleService.addPerson(this.person).subscribe(i=>{ this.reset(i)}); 
    } 

    reset(person1 : Person){ 
     if(person1.id != 0){ 
      console.log(this.person); 
      this.message = "Person Added Successfully.!"; 
      this.person = { id : 0, height : 0, weight : 0, name : "", proffesion : 0}; 
     } 
     else{ 
      this.message = "Something Went Wrong"; 
     } 
    } 

enter image description here を: enter image description here

私の問題は、フォームを提出した後です。検証をリセットします。ですが、私はフォームをリセットしたくありません。成功した挿入のメッセージを表示したいのですが。

答えて

1

フォームコントロールのtouchedおよびdirtyフラグをクリアする場合は、FormGroupresetオペレーションを使用できます。内部的には、すべての子孫にpristineuntouchedとマークされます。

resetメソッドでは、フォーム状態の値のマップも取得できるため、すべての(または以前のフォーム送信からの値の一部)を保持することができます。あなたの質問からまたthis example

を参照してください:messageプロパティはの一部ではないとして

私が成功した挿入のためのメッセージ

にフォームのリセットを表示したいとして、これを表示するあなたに影響を与えないであろうフォーム - これはコンポーネントの通常のプロパティです。

+0

フォームグループの作業を行うために、コードの構造を変更する必要があります。 Formgroupは私が選択したアプローチよりも優れたアプローチですか? –

+0

私はあなたのアプローチを変更しなければならないとは思わない、あなたはテンプレート駆動型を使い続け、 'personForm.reset()'を呼び出すことができる。 –

0

savePersonメソッドでは、FormGroup markAsPristineメソッドを呼び出す必要があります。

このこの方法の公式ドキュメント: https://angular.io/api/forms/AbstractControl#markAsPristine

は、コンポーネントクラスのFormGroupオブジェクトへのアクセスを取得するには、@ViewChildを使用することができます。

関連する問題