2017-04-13 79 views
2

我想在這裏沒有窗體標記的情況下對複選框進行驗證。 應至少選擇一個複選框。如何驗證是否應該選擇至少一個複選框?

<div *ngFor="let item of officeLIST"> 
    <div *ngIf=" item.officeID == 1"> 
    <input #off type="checkbox" id="off" name="off" value="1" [(ngModel)]="item.checked"> 
    <label>{{item.officename}}</label> 
    </div> 

    <div *ngIf="item.officeID== 2"> 
    <input #off type="checkbox" id="off" name="off" value="2" [(ngModel)]="item.checked"> 
    <label>{{item.officename}}</label> 
    </div> 

    <div *ngIf="item.officeID== 3"> 
    <input #off type="checkbox" id="off" name="off" value="3" [(ngModel)]="item.checked"> 
    <label>{{item.officename}}</label> 
    </div> 
</div> 

其他領域我會把所需做的錯誤|感動|有效等,但因爲複選框是不是單一的輸入,我不能把每一個複選框必需的,因爲所有的複選框將被強制託運。那麼我該如何做驗證來提醒用戶至少應該檢查一個?

+0

您沒有使用任何表單標籤,通過驗證,當你想驗證?像'點擊某個按鈕時應該說什麼都沒選擇' – Aravind

+0

我想驗證何時沒有單個複選框被選中。例如:名稱:文本框,當用戶點擊它,但沒有輸入任何內容時,應顯示'名稱是必需的'。同樣去複選框 – user3431310

回答

7

考慮使用FormGroupValidators實現這一目標。

  • 定義一組爲您的複選框
  • 指定一組驗證

import { NgModule, Component }  from '@angular/core'; 
import { FormsModule, ReactiveFormsModule, FormGroup, FormControl, FormArray, FormBuilder, Validators }  from '@angular/forms'; 
import { BrowserModule } from '@angular/platform-browser'; 

@Component({ 
    selector: 'my-app', 
    styles: [` 
    div {padding:5px; margin: 10px 0;} 
    .invalid {background-color: #ffd4d4;} 
    `], 
    template: ` 
    <form [formGroup]="modelForm"> 
     <div [formArrayName]="'items'" [class.invalid]="!modelForm.controls.selectedItems.valid"> 
     <div *ngFor="let language of modelForm.controls.items.controls; let i = index;" [formGroup]="language"> 
      <input type="checkbox" formControlName="checked" id="language_{{ language.controls.key.value }}"> 
      <label attr.for="language_{{ language.controls.key.value }}">{{ language.controls.value.value }}</label> 
     </div> 
     </div> 
     <div [class.invalid]="!modelForm.controls.selectedItems.valid" *ngIf="!modelForm.controls.selectedItems.valid"> 
     checkbox group is required! 
     </div> 
     <hr> 
     <pre>{{modelForm.controls.selectedItems.value | json}}</pre> 
    </form> 
    ` 
}) 
export class AppComponent { 

    modelForm:FormGroup; 
    items = [ 
    {key: 'item1', value: 'value1'}, 
    {key: 'item2', value: 'value2'}, 
    {key: 'item3', value: 'value3'}, 
    ]; 

    constructor(){ 
    } 

    ngOnInit() { 
    let group = []; 

    this.items.forEach((l) => { 
     group.push(new FormGroup({ 
     key: new FormControl(l.key), 
     value: new FormControl(l.value), 
     checked: new FormControl(false), 
    ); 
    }); 

    let formControlArray = new FormArray(group); 

    this.modelForm = new FormGroup({ 
     items: formControlArray, 
     selectedItems: new FormControl(this.mapItems(formControlArray.value), Validators.required) 
    }); 

    formControlArray.valueChanges.subscribe((v) => { 
     this.modelForm.controls.selectedItems.setValue(this.mapItems(v)); 
    }); 
    } 

    mapItems(items) { 
    let selectedItems = items.filter((l) => l.checked).map((l) => l.key); 
    return selectedItems.length ? selectedItems : null; 
    } 
} 

請參閱本plunker

+0

更好的回答恕我直言 – Lereveme

+0

這是最好的答案和一個很好的代碼示例。 – codeepic

3

驗證(即例如某個點擊事件)迭代您的數組並檢查是否至少有一個項目爲真。

let isSelected: any = this.officeLIST.filter((item) => item.checked === true); 
if(isSelected != null && isSelected.length > 0) { 
//At least one is selected 
}else { 
alert("select at least one"); 
} 
+0

嗨nugu,我應該在我的構造函數,ngOnIt中執行此代碼嗎? – user3431310

+0

oo讓我說我的點擊,更新()(去更新功能,所以我應該檢查嗎?) – user3431310

+0

是理想的按鈕點擊會做:) – Nugu

0

您應該檢查表單元素的感動和骯髒的環境

<form #myForm="ngForm" *ngIf="active" (ngSubmit)="onSubmit()"> 

    <div class="form-group"> 
     <label for="name">Name</label> 
     <input type="text" id="name" class="form-control" 
       required name="name" [(ngModel)]="myform.name" 
       #name="ngModel" > 
     <div *ngIf="name.errors && (name.dirty || name.touched)" 
      class="alert alert-danger"> 
      <div [hidden]="!name.errors.required"> 
       Name is required 
      </div> 
     </div> 
    </div> 

</form> 

可以結合前面我的回答對兩種情況下

+0

是的我設法做到這一點,但現在我想爲複選框 – user3431310

+0

可以你告訴確切的JSON格式的'officeLIST'對象 – Aravind

0

您可以檢查陣「officeList」通過使用映射函數,您可以遍歷數組中的每個「對象」,並檢查每個「object.checked」,並且如果至少發現一個「object.checked」爲true,則意味着至少有一個複選框被選中else顯示錯誤消息。在提交按鈕上應用此'onClick()'功能。希望能幫助到你。 事情是這樣的:

提交

在component.ts:

onClick(){ 
    let flag=false; 
    this.officeList.map(function(obj){ 
     if(obj.checked===true){ 
      flag=true; //set the flag again 
     } 
    }) 
    if(flag===false){ 
     alert('atleast one checkbox should be checked'); 
     flag=true; //reset the flag again 
    } 
} 
相關問題