角度材料触发器以编程方式触摸状态

时间:2017-09-21 19:25:24

标签: angular angular-material2

我使用带有@angular/material版本2.0.0-beta.10的Angular 4反应表单。我需要以编程方式显示md-error消息。

在必填字段上,当用户在未输入任何文字的情况下离开输入时,我有md-error表示,"此字段是必填字段。"见代码:

<md-form-field>
    <input mdInput type="text"
           formControlName="PartNumber"
           placeholder="Part Number"
           maxlength="250"
           required />
    <md-error *ngIf="formGroup.controls['PartNumber'].hasError('required')">
        Part Number is <strong>required</strong>
    </md-error>
</md-form-field>

我试过了两个:

this.formGroup.markAsTouched();
this.formGroup.markAsDirty();

当我致电md-error<input>时,markAsTouched()下方的markAsDirty()文字未显示。

如何以编程方式触发触摸状态,以便显示错误消息?

2 个答案:

答案 0 :(得分:4)

更好的解决方案可能是使用custom error matcher

以下是使用类属性决定何时应显示错误的示例:http://plnkr.co/edit/U5xtdKWggcbgU2EHKkK9?p=preview

<md-form-field>
  <input mdInput [formControl]="myInput" placeholder="My Input" [errorStateMatcher]="showWhenISayTo">
  <md-error>Field is required</md-error>
</md-form-field>


// Set this to `true` to show the errors
showError = false;

myInput = new FormControl('', Validators.required)

showWhenISayTo = () => {
  return this.showError;
}

此外,您可以将其配置为全局使用相同的行为。以下是无效控件脏时显示错误的示例:http://plnkr.co/edit/gcQuzYChrl5d7UYXo8eS?p=preview

import {MD_ERROR_GLOBAL_OPTIONS, showOnDirtyErrorStateMatcher} from '@angular/material';

@NgModule({
  providers: [
    {provide: MD_ERROR_GLOBAL_OPTIONS, useValue: {errorStateMatcher: showOnDirtyErrorStateMatcher}}
  ]
})

答案 1 :(得分:1)

解决方案是遍历每个控件并将每个控件标记为触摸:

Object.keys(this.formGroup.controls).forEach(key => {
    const ctrl = this.formGroup.get(key);
    ctrl.markAsTouched({ onlySelf: true });
});