使用 Angular 2 Forms 根据需要动态标记字段的正确方法是什么?

what is the proper way to dynamically mark a field as required using Angular 2 Forms?

使用Angular 2 (2.0.0),使用Angular Forms动态标记字段的推荐方法是什么?

在他们的所有示例中,只添加了必需的属性,例如:

<input type="text" class="form-control" id="name" required>

如果我要绑定的模型有 IsRequired 属性,那将是 true/false 怎么办?

如果我使用类似的东西:

<input [(ngModel)]="field.Value" type="text" value="{{field.Value}}" [attr.required]="field.IsRequired"/>

在页面上呈现为(注意 ="true"):

<input type="text" required="true" />

出于某种原因,当 Angular 具有实际值(="true")时,它似乎无法识别此属性,因此当此字段为空,我的表单本身仍然有效:

<form class="ng-untouched ng-pristine ng-valid">

所以看来我必须使用 required 而不是 required="true",但是我怎样才能动态添加该属性?

什么也不起作用:

<input type="text" {{ getRequiredAttr(field) }} />

我想我也许可以有一个函数 returns 我的字符串 "required" 基于字段,它只会给出模板错误。

有没有办法完成此操作并只为我的属性呈现 required?或者让 Angular 在其值为 true/false 时识别此属性的方法?

FWIW - 我已经验证我可以使用 *ngIf 编写两个基于我的 IsRequired 属性 的几乎相同的 <input type='text' /> 控件并使用required 属性,但这看起来很老套。希望有更好的方法!

基本表单非常适合简单表单,但是当您需要更多控制(就像您在此处拥有的那样)时,也就是您需要开始使用更高级表单的时候。在你的情况下会是什么样子。

@Component({
  selector: 'something',
  template: `
  <form #myForm="ngForm">
    <input [(ngModel)]="field.Value" [formContol]="myFieldControl" type="text" [value]="field.Value">
  </form>
  `
})
export class MyComponent{
  public field: any = {Value: 'hello', isRequired: false};
  public myFieldControl: FormControl = new FormControl('', [this.dynamicRequiredValidator.bind(this)]);

  public dynamicRequiredValidator(control: FormControl):{[key: string]: boolean}{
    if(field.IsRequired && !control.value){
      return {required: true};
    }
    return {};
  }
}

Note: You will probably need to import the ReactiveFormsModule into your @NgModule. This comes from @angular/forms as well.

还有另一种方法可以使用 here.

中显示的指令执行此操作

既然可以简单地做到这一点,为什么要把它搞得这么复杂,

[required]="isFieldRequired() ? 'required' : null"