检查是否需要 NgControl

Check if NgControl is required

出于各种原因,我有几个包装 PrimeNG 组件的自定义组件。我的组件的一些实例以反应形式使用,并且字段的“要求”是使用 Validators.required 验证器设置的。

PrimeNG 组件提供 required 属性。

如何检查组件的 NgControl 是否需要验证器?有 .disabled.invalid,但 .invalid 可能意味着任何东西。

这是我现在使用的,它适用于下拉菜单,但对于任何其他类型的输入都是不正确的。

@Component({
  selector: 'my-component',
  templateUrl: 'my.component.html'
})
export class MyComponent implements OnInit, ControlValueAccessor {
  
  @Input()
  public disabled: boolean
  @Input()
  public required: boolean

  constructor(
        @Optional() @Self() public ngControl: NgControl
  ) {
        if (this.ngControl != null) {
            this.ngControl.valueAccessor = this;
        }
    }

    ngOnInit() {
        if (this.ngControl) {
            this.required = this.ngControl.invalid;
            this.disabled = this.ngControl.disabled;
        }
    }
}

我确定有更好的方法来做到这一点,但我不知道如何做。

尝试检查控件是否有 required 验证器,如下所示:

  ngOnInit() {
    if (this.ngControl) {
      this.required = this.hasRequiredValidator(this.ngControl.control);
      this.disabled = this.ngControl.disabled;
    }
  }

  hasRequiredValidator(control: AbstractControl): boolean {
    if (control.validator) {
      const validator = control.validator({} as AbstractControl);
      if (validator && validator.required) {
        return true;
      }
    }
    return false;
  }