如何使angular2组件ng-invalid

How to make angular2 component ng-invalid

我需要编写一个可以在表单中使用的组件。我想将其发布为表单的 ng-invalid。

这是我的表格template/view:

    <form  #myForm="ngForm">        
    <domain-base-value  [(ngModel)]="value.value" name="bla" #bla="ngModel">
    </domain-base-value>
    <div [hidden]="myForm.valid || myForm.pristine">
      Form is not valid
    </div>
    </form>

即domain-base-value组件视图: <input [(ngModel)]="value" required /> 如果我 运行 它,输入得到 ng-invalid 但不是 domain-base-value 和表单。 我可以将 required 移动到表单,但我希望子组件在有效和无效时具有逻辑。 有什么建议吗?

您需要通过实现自定义值访问器来使您的子组件与 ngModel 兼容。这样您就可以使用 ngModelngFormControl 等指令来应用验证器。

这是一个示例:

const MY_VALUE_ACCESSOR = new Provider(
  NG_VALUE_ACCESSOR, {useExisting: forwardRef(() => MyInputComponent), multi: true});

@Component({
  (...)
  providers: [ MY_VALUE_ACCESSOR ]
})
export class MyInputComponent extends DefaultValueAccessor {
  onChange = (_) => {};
  onTouched = () => {};

  writeValue(value:any):void {
    if (value!=null) {
      super.writeValue(value.toString());
    }
  }

  // call when your internal input is updated
  doOnChange(val) {
    this.onChange(val);
  }
}

有关详细信息,请参阅本文(第 "NgModel-compatible component" 部分):

另见这个问题:

重复:

  • 您有一个组件,它包含一个输入字段。
  • 这个输入字段本身是一个 ngModel 并且具有 ng-invalid 属性
  • 调用该组件的表单不知道 domain-base-value 组件中的无效输入字段

我认为问题在于,您的 ngForm 不知道组件内的输入字段。我的解决方案是将 ngForm 作为 @Input 参数添加到 domain-base-value 组件,并在组件内部将 ngModel 添加到表单。您的表单如下所示:

<form  #myForm="ngForm">
    <domain-base-value  
        [(ngModel)]="value.value" 
        name="bla" 
        #bla="ngModel"
        [form]="myForm"
    >
    </domain-base-value>
    <div [hidden]="myForm.valid || myForm.pristine">
        Form is not valid
    </div>
 </form>

在您的组件内部,它看起来像:

@Component({...})
export class DomainBaseValue implements OnInit {

    @Input() form: NgForm;

    @ViewChild('input1') input1;

    ngOnInit() {
        this.form.addControl(this.input1);
    }

}

这应该将 NgModel 附加到您的 NgForm,您现在应该会在表单上看到正确的属性。

希望这对您有所帮助。

使用禁用来完成这个

<form  #myForm="ngForm">
    <domain-base-value  [(ngModel)]="value.value" name="bla" #bla="ngModel">
    </domain-base-value>
    <div [disabled]="!form.valid || form.pristine">
      Form is not valid
    </div>
</form>