首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Angular ControlValueAccessor必需属性

Angular ControlValueAccessor必需属性
EN

Stack Overflow用户
提问于 2018-10-23 14:27:43
回答 2查看 3.2K关注 0票数 2

我有一个实现ControlValueAccessor的textbox控件。在表单中,我在表单字段名称上放置了一个必需的验证器:

代码语言:javascript
复制
 this.formGroup = this.fb.group({
        name: ['', Validators.required]
    });

在模板中,我使用如下控件:

代码语言:javascript
复制
<input-text formControlName="name"></input>

Angular required验证有效,但内部文本框没有required属性。如果需要,我想设置此文本框的样式,如何完成此操作?

EN

回答 2

Stack Overflow用户

发布于 2018-10-23 14:47:29

您需要检查表单控件的值更改,如下所示

代码语言:javascript
复制
this.control.valueChanges.subscribe(
            (res) => {
                this.setErrorMessage(this.control);
            }
        )

然后在setErrorMessage内部检查control.errors

代码语言:javascript
复制
if (control.errors) {
  for (let propertyName in control.errors) {
    if(propertyName == "required") {
      // you can do things here to your input field by using element reference
    }
  }
}

我创建了一个to函数来知道输入字段是否为dirt=y

代码语言:javascript
复制
//Validate single field
export function isInputFieldDirty(controlName: string, formGroupObject: FormGroup) {
if (formGroupObject.get(controlName)) {
    return !formGroupObject.get(controlName).pristine &&
        ((formGroupObject.get(controlName).untouched && formGroupObject.get(controlName).dirty && formGroupObject.get(controlName).invalid) ||
            (formGroupObject.get(controlName).touched && formGroupObject.get(controlName).invalid))
        ? true : false;
}

}

票数 0
EN

Stack Overflow用户

发布于 2019-04-09 22:08:44

如果您想在控件具有必需的验证器的情况下设置字段的样式,则可以使用此实用程序:

代码语言:javascript
复制
  isRequired(formControl: AbstractControl): boolean {
    return this.hasRequiredField(formControl);
  }
  hasRequiredField = (abstractControl: AbstractControl): boolean => {
    // caso formControl
    if (abstractControl.validator) {
      const validator = abstractControl.validator({} as AbstractControl);
      if (validator && validator.required) {
        return true;
      }
    } // caso formGroup
    if (abstractControl['controls']) {
      for (const controlName in abstractControl['controls']) {
        if (abstractControl['controls'][controlName]) {
          if (this.hasRequiredField(abstractControl['controls'][controlName])) {
            return true;
          }
        }
      }
    }
    return false;
  }

在你的控制器中

代码语言:javascript
复制
isRequired(formControlName){
    isRequired(formControlName: string): boolean {
        return this.utils.isRequired(this.form.get(formControlName));
    }
}

如果您想要在字段无效时显示消息并应用样式,您可以简单地使用" valid“属性来显示字段无效时的消息错误当字段无效时对象返回到hasError('required')

现在如果你想设置样式

代码语言:javascript
复制
<label> Name {{isRequired('name') ? '*' :'' }} </label>
<input-text formControlName="name" [ngClass]="{'required': isRequired('name'), 'notValid' : !this.form.get('name').valid  }"></input>

<span class="help-block error" *ngIf="((form.get('name').touched || form.get('name').dirty) && !form.get('name').valid)">
        <span *ngIf="form.get('name').hasError('required')">
            {{ 'ERROR_MSG.REQUIRED' | translate }}
        </span>
        <span *ngIf="form.get('name').hasError('maxlength')">
            {{ 'ERROR_MSG.MAXLENGTH' | translate }} {{getError('maxlength').requiredLength}}
        </span>
        <span *ngIf="form.get('name').hasError('minlength')">
            {{ 'ERROR_MSG.MINLENGTH' | translate }} {{getError('minlength').requiredLength}}
        </span>

        <span *ngIf="form.get('name').hasError('myCustomError')">
            {{ 'ERROR_MSG.CUSTOM' | translate }}
        </span>
    </span>
</div>

getError(error: string) {
    return this.form.controls['name'].errors[error];
  }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52942434

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档