我正在使用 ngModelGroup 指令将多个表单输入组合在一起。

在文档( https://angular.io/docs/ts/latest/api/forms/index/NgModelGroup-directive.html )中,我读到有一个 validators: any[] 属性。

这是否意味着我可以添加一个仅验证该 ngModelGroup 的自定义验证器函数?如果是这样,我该如何使用它?

那太棒了,因为我想检查是否至少选中了 ngModelGroup 中的一个复选框。我不能使用 required 因为这意味着所有复选框都是必需的。我在文档中找不到任何关于此的信息,还是我找错了地方?

最佳答案

这完全可以通过 ngModelGroup 和用于验证的自定义指令实现。理解为什么这有效的关键是 ngModelGroup


首先,我们将构建我们的指令,该指令非常样板,没有什么特别之处:

@Directive({
  selector: '[hasRequiredCheckboxInGroup]',
  providers: [{provide: NG_VALIDATORS, useExisting: HasRequiredCheckBoxInGroup, multi: true}]
})
export class HasRequiredCheckBoxInGroup implements Validator, OnChanges {
  private valFn = Validators.nullValidator;

  constructor() {
    this.valFn = validateRequiredCheckboxInGroup();
  }

  validate(control: AbstractControl): {[key: string]: any} {
    return this.valFn(control);
  }
}

我们的验证函数是我们获取 ngModelGroup 创建 FormGroup 并应用它的关键知识的地方:
function validateRequiredCheckboxInGroup() : ValidatorFn {
      return (group) => { //take the group we declare in the template as a parameter
        let isValid = false; //default to invalid for this case
        if(group) {
          for(let ctrl in group.controls) {
            if(group.controls[ctrl].value && typeof group.controls[ctrl].value === 'boolean') { // including a radio button set might blow this up, but hey, let's be careful with the directives
              isValid = group.controls[ctrl].value;
            }
          }
        }

        if(isValid) {
          return null;
        } else {
          return { checkboxRequired: true };
        }
      }
    }

最后,在我们的模块中包含并声明了指令,我们返回到模板(需要在一个表单中):
<form #f="ngForm">
      <div ngModelGroup="checkboxes" #chks="ngModelGroup" hasRequiredCheckboxInGroup>
          <input type="checkbox" name="chk1" [(ngModel)]="checks['1']"/>
          <input type="checkbox" name="chk2" [(ngModel)]="checks['2']"/>
      </div>
      <div>
      {{chks.valid}}
      </div>
</form>

这是一个可以玩所有这些的plunker:
http://plnkr.co/edit/AXWGn5XwRo60fkqGBU3V?p=preview

关于javascript - Angular 2 : Add validators to ngModelGroup,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40612483/

10-09 15:20