2017-12-10 12 views
0

私は、Twitterのブートストラップとjqueryを使ってEmployeesのデータを表示する簡単なAngularアプリを作っています。 4データはハードコーディングされ、テーブルに添付されているイメージのように表示されます。私は従業員の情報を追加するフォームを含むモーダルボックスをポップアップする "従業員の追加"ボタンを追加しました。私も検証を使用しましたが、空のデータも送信します。ここ角度のフォームバリデーション

This is the initial page after i run the app

The error message shows but blank data can be submitted!

This is the table after submtting blank data from the Modal

成分である:

employee-data.component.html

<div class="container"> 
<table class="table table-bordered table-condensed table-responsive"> 
    <thead class="thead-inverse"> 
     <tr> 
      <td>Id</td> 
      <td>Name</td> 
      <td>Address</td> 
      <td>Gender</td> 
      <td>Company</td> 
      <td>Action</td> 
     </tr> 
    </thead> 

    <tbody> 
     <tr *ngFor="let employee of employees; let i= index;"> 
      <td> 
       <input 
        class="form-control" 
        type="number" 
        min="1" [(ngModel)]="employee.id" 
        [disabled]="!employee.isEditable"> 
      </td> 
      <td> 
       <input 
        type="text" 
        class="form-control" 
        [(ngModel)]="employee.name" 
        [disabled]="!employee.isEditable" 
        > 
      </td> 
      <td> 
       <input 
        type="text" 
        class="form-control" 
        [(ngModel)]="employee.address" 
        [disabled]="!employee.isEditable" 
        > 
      </td> 
      <td> 
       <input 
        type="text" 
        class="form-control" 
        [(ngModel)]="employee.gender" 
        [disabled]="!employee.isEditable" 
        > 
      </td> 
      <td> 
       <input 
        type="text" 
        class="form-control" 
        [(ngModel)]="employee.company" 
        [disabled]="!employee.isEditable" 
        > 
      </td> 
      <td> 
       <div> 
        <!-- <button (click)="editEmployee(i)">Edit</button> --> 
        <button 
         class="btn btn-warning" 
         (click)="employee.isEditable=!employee.isEditable" 
         *ngIf="!employee.isEditable" > 
         Edit 
        </button> 
        <button 
         class="btn btn-warning" 
         (click)="employee.isEditable=!employee.isEditable" 
         *ngIf="employee.isEditable" > 
         Save 
        </button> 
        <button 
         class="btn btn-danger" 
         (click)="deleteEmployee(i)"> 
         Delete 
        </button> 
       </div> 
      </td> 
     </tr> 
    </tbody> 
</table> 

<!-- Trigger the modal with a button --> 
<button 
    type="button" 
    class="btn btn-success btn-md" 
    data-toggle="modal" 
    data-target="#myModal"> 
     Add Employee 
</button> 

<!-- Modal --> 
<div id="myModal" class="modal fade" role="dialog"> 
    <div class="modal-dialog"> 

     <!-- Modal content--> 
     <div class="modal-content"> 
      <div class="modal-header"> 
       <button type="button" class="close" data-dismiss="modal">&times;</button> 
       <h4 class="modal-title">Add Employee</h4> 
      </div> 

      <!-- Modal Body --> 
      <div class="modal-body"> 
       <form [formGroup]="userForm" (ngSubmit)="addRow()"> 
        <div class="form-group"> 
         <label>Id</label> 
         <div> 
          <input 
           type="number" class="form-control" 
           formControlName="ModalId" name="id" 
           [(ngModel)]="id" 
           min="1" required /> 
          <div 
           class="alert alert-danger" 
           *ngIf="!userForm.controls['ModalId'].valid && userForm.controls['ModalId'].touched"> 
            Error! 
          </div> 
         </div> 
        </div> 

        <div class="form-group"> 
         <label>Name</label> 
          <div> 
           <input 
            type="text" class="form-control" 
            formControlName="ModalName" name="name" 
            [(ngModel)]="name" required /> 
          </div> 
          <div 
           class="alert alert-danger" 
           *ngIf="!userForm.controls['ModalName'].valid && userForm.controls['ModalName'].touched"> 
           Error! 
          </div> 
        </div> 

        <div class="form-group"> 
         <label>Address</label> 
         <div> 
          <input 
           type="text" class="form-control" 
           formControlName="ModalAddress" name="address" 
           [(ngModel)]="address" required /> 
          <div 
           class="alert alert-danger" 
           *ngIf="!userForm.controls['ModalAddress'].valid && userForm.controls['ModalAddress'].touched"> 
            Error! 
          </div> 

         </div> 
        </div> 

        <div class="form-group"> 
         <label for="gender">Gender</label> 
         <div> 
          <!-- <input 
           type="text" class="form-control" name="gender" 
           [(ngModel)]="gender" required /> --> 
          <select class="form-control" 
           [(ngModel)]="gender" 
           [ngModelOptions]="{standalone: true}" 
           > 
           <option value="Male">Male</option> 
           <option value="Female">Female</option> 
          </select> 
         </div> 
        </div> 

        <div class="form-group"> 
         <label>Company</label> 
         <div> 
          <input 
           type="text" class="form-control" 
           formControlName="ModalCompany" name="company" 
           [(ngModel)]="company" required /> 
         </div> 
         <div 
          class="alert alert-danger" 
          *ngIf="!userForm.controls['ModalCompany'].valid && userForm.controls['ModalCompany'].touched"> 
          Error! 
         </div> 
        </div> 

        <div class="form-group"> 
         <input 
          type="submit" 
          value="Submit" 
          class="btn btn-success"> 
        </div> 
       </form> 
      </div> 

      <!-- Modal Footer --> 
      <div class="modal-footer"> 
       <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button> 
      </div> 
     </div> 

    </div> 
</div> 

employee-data.compenent.ts

import { Component } from '@angular/core'; 
import { Employee } from './employee'; 
//import { NgForm } from '@angular/forms'; 
import { FormGroup, FormBuilder, Validators } from '@angular/forms'; 
import { promise } from 'selenium-webdriver'; 


@Component({ 
    selector: 'employee-data', 
    templateUrl: './employee-data.component.html', 
    styles: [``] 
}) 

export class EmployeeDataComponent { 

    userForm: FormGroup; 

    constructor(private formBuilder: FormBuilder) { 

    this.userForm = this.formBuilder.group({ 
     'ModalId': ['', Validators.required], 
     'ModalName': ['', Validators.required], 
     'ModalAddress': ['', Validators.required], 
     'ModalCompany': ['', Validators.required] 

    }) 

    } 

    id: number; 
    name: string; 
    address: string; 
    gender: string; 
    company: string; 
    isEditable: boolean; 

    //emp: Employee[] = []; 

    employees: Employee[] = [ 
    { 
     id: 1, 
     name: 'Ram', 
     address: 'Kupondole', 
     gender: 'Male', 
     company: 'XYZ Techno Sales', 
     isEditable: false 
    }, 
    { 
     id: 2, 
     name: 'Shyam', 
     address: 'Baneshwor', 
     gender: 'Male', 
     company: 'ABC Enterprises', 
     isEditable: false 
    }, 
    { 
     id: 3, 
     name: 'Prashansha', 
     address: 'Tripureshwor', 
     gender: 'Female', 
     company: 'MNO Inc', 
     isEditable: false 
    }, 
    { 
     id: 4, 
     name: 'Rita', 
     address: 'Ghatthaghar', 
     gender: 'Female', 
     company: 'Subisu', 
     isEditable: false 
    } 
    ]; 

    addRow() { 
    //prompt("Checking the control!"); 
    this.employees.push({ 
     id: this.id, 
     name: this.name, 
     address: this.address, 
     gender: this.gender, 
     company: this.company, 
     isEditable: this.isEditable 

    }); 
    } 

    deleteEmployee(index) { 

    this.employees.splice(index, 1); 
    } 

    editEmployee(index) { 

    debugger; 
    this.employees[index].isEditable = true; 

    } 
} 

誰もが、私は選択肢のうち、実行している原因を私を助けることができます!

+1

一見すると、あなたはテンプレートフォームと反応します。 – Thodoris

+0

私の目の前ですぐにポップする間違いは、フォームビルダーでバリデータを使用しているということです。つまり、反応的なフォームを使用していて、フィールドのngModelがあります。同時に両方のアプローチを持つことはできません。 NgModelはテンプレート駆動型で反応型はコード駆動型を意味します。オプションのうち1つだけを選択する必要があります –

+0

フォームで#f = "ngForm"を使用し、送信時に送信し、有効なフォーム提出かどうかをf.validを使用してチェックします。 –

答えて

2

あなたは反応型とテンプレート主導のフォームを混合しています。私はFormBuilderを使用しているので、あなたが本当に望んでいるのは反応するフォームだと思います。

ここで行う必要があります。あなたのhtmlで

削除テンプレート駆動のコードが

  • userForm

    から値を取得します[(ngModel)]

であなたが得る方法を、すべてのコードを削除しますフォームの価値が間違っています addRow()を次のように変更してくださいこの

addRow() { 
    this.id = this.userForm.controls['ModalId'].value; 
    this.name = this.userForm.controls['ModalName'].value; 
    //more code here.   
    //you get the picture and do the remaining data. 
    this.employees.push({ 
     id: this.id, 
     name: this.name, 
     address: this.address, 
     gender: this.gender, 
     company: this.company, 
     isEditable: this.isEditable 

    }); 
    } 

希望します。

+0

ありがとう、トンブロ! –

+0

@SaigalAmatya問題ありません。助けてうれしい – brijmcq

1

私はbrijmcqに同意し、テンプレート駆動型または反応型のどちらかを選択します。両方を混用しないでください。フォームからビルドしたオブジェクトをそのまま配列にプッシュできます。これで、フォーム制御名をEmployeeインターフェイス/クラスと一致するように変更してください。

brijmcqと同様に、テンプレートドリブンフォームに関連するすべてのもの(ngModel)とテンプレートに設定されたバリデーターを削除します。代わりに、フォーム・グループを使用します。

this.userForm = this.formBuilder.group({ 
    id: ['', [Validators.minLength(1), Validators.required]], 
    name: ['', Validators.required] 
}); 

は、フォームの値を渡し、それからちょうどあなたのフォームにフォームコントロール名をマークし、上の提出:

<form [formGroup]="userForm" (ngSubmit)="addRow(userForm.value)"> 
    <label>Id</label> 
    <input type="number" class="form-control" formControlName="id" /> 
    <div class="alert alert-danger" *ngIf="!userForm.controls['id'].valid && userForm.controls['id'].touched"> 
    Error! 
    </div> 
    <!-- more code here --> 
</form> 

そして添加する方法従業員はフォームオブジェクトを配列にプッシュしてフォームをリセットするだけです。

addRow(values) { 
    this.employees.push(values); 
    this.userForm.reset(); 
} 

StackBlitz

+0

あなたも助けてくれてありがとう! –

関連する問題