【问题标题】:what is the proper way to dynamically mark a field as required using Angular 2 Forms?使用Angular 2 Forms根据需要动态标记字段的正确方法是什么?
【发布时间】:2017-02-26 21:53:46
【问题描述】:

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

在他们所有的例子中,required 属性只是添加如下:

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

如果我绑定的模型有一个IsRequired 属性,那将是真/假?

如果我使用类似的东西:

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

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

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

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

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

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

什么也不起作用:

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

我想我也许可以有一个函数根据字段返回我的字符串“必需”,这只会给出模板错误。

有没有办法做到这一点并只为我的属性呈现required?或者当它的值为真/假时,让 Angular 识别这个属性的方法?

FWIW - 我已经验证我可以使用*ngIf 根据我的IsRequired 属性编写两个几乎相同的&lt;input type='text' /&gt; 控件,并使用required 属性硬编码一个控件,但这看起来很hacky。希望有更好的方法!

【问题讨论】:

    标签: angular angular2-forms html5-validation


    【解决方案1】:

    既然可以这么简单,为什么还要搞得这么复杂,

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

    【讨论】:

    • 这对于基本场景来说可能没问题,是的。但最终,对于更复杂的验证(使用自定义验证器等),我更愿意让反应式表单尽可能多地处理它。
    • 我依靠响应式表单来捕获验证,但除非存在“必需”属性(我知道很挑剔),否则我看不到字段标签上的星号。所以这个解决方案正是我所需要的。
    • 我不知道为什么这个答案如此受欢迎。问题是询问如何使用响应式表单 API 将表单标记为需要,此答案主动尝试实际回答。
    • 当我们搜索如何动​​态地将“必需”属性添加到输入时,我们会遇到这个问题,这个答案回答了我们的问题(不确定 OP 的问题)。所以我们赞成。
    【解决方案2】:

    基本表单的内容非常适合简单的表单,但是当您需要像这里所拥有的那样进行更多控制时,您需要开始使用更高级的表单内容。在你的情况下看起来会是这样的。

    @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 {};
      }
    }
    

    注意:您可能需要将ReactiveFormsModule 导入您的@NgModule。这也来自@angular/forms

    还有另一种方法可以使用显示为here 的指令来执行此操作。

    【讨论】:

    • 有趣 - 我会试一试。谢谢!
    • 我猜它并不完全存在。我的&lt;form&gt; 仍然显示ng-valid,尽管我的字段现在是正确的ng-invalid。我需要做一些特殊的事情才能正确更新表格吗?我认为这是因为 required 属性实际上并没有出现在您的解决方案中?
    • 当使用FormControl 时,该属性不会出现。验证器作为第二个参数传入FormControl,它是一个验证器数组。这是有趣的[this.dynamicRequiredValidator.bin(this)] 部分。您还需要确保在您的&lt;form&gt; 上使用(ngSubmit) 来触发验证。要调试,我会在dynamicRequiredValidator 中推荐几个console.log(),以确保它正在运行,并返回正确的结果
    • 哦,等等,你说的是表单本身……嗯……看看FormBuilderFormGroup
    • 这就是我现在正在研究的。我在我的问题中没有充分说明这一点。你的回答仍然符合我的要求:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-23
    • 2019-02-09
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多