【问题标题】:How to make a formControl readonly如何使 formControl 只读
【发布时间】:2018-01-09 04:01:40
【问题描述】:

如何以角度只读方式制作 formControl

我知道我可以在 html 中做到这一点

<input type="text" formControlName="xyz" readonly />

如何从 JS 代码而不是 html 中做到这一点,即以模型驱动的方式

【问题讨论】:

  • 您可以通过this.form.controls.name.disable({onlySelf: true}); 设置禁用,但目前我没有找到readonly 的任何内容。
  • 这里有一个相关问题:github.com/angular/angular/issues/11447,现在好像没有提供。

标签: angular angular-reactive-forms


【解决方案1】:

如果您使用的是响应式表单,您可以像在 下面的示例代码(电子邮件字段)

    this.registerForm = this.formBuilder.group({
          first_name: ['', Validators.required],
          last_name: ['', Validators.required],
          email: new FormControl({value: null, disabled: true}, Validators.required),
          password: ['', Validators.compose([Validators.required, Validators.email])],
          confirm_password: ['', Validators.required],
    });

如果您想获取所有值,包括您应该使用的禁用控件:

    this.registerForm.getRawValue();

查看源码的方法注释

    /**
       * The aggregate value of the `FormGroup`, including any disabled controls.
       *
       * If you'd like to include all values regardless of disabled status, use this method.
       * Otherwise, the `value` property is the best way to get the value of the group.
       */
      getRawValue(): any;

享受编码!

【讨论】:

  • 在 formControl 中禁用控件会导致 null 值。
  • @PSyLoCKe 如果您想获取所有值,包括禁用的控件,您应该使用:this.registerForm.getRawValue();
  • 我不明白为什么这被用作接受的答案......正如上面提到的 PSyLoCKe - getRawValue() 不会获取禁用的值。即使您尝试 getRawValue(),它们仍然为 NULL。
  • @tom33pr 为避免混淆,请始终查阅官方文档。 /** * FormGroup 的聚合值,包括任何禁用的控件。 * * 如果您想包含所有值而不考虑禁用状态,请使用此方法。 * 否则,value 属性是获取组值的最佳方式。 */ getRawValue(): 任意;
  • @PleaseDontBullyMe 如果你想获取所有值,包括禁用的控件,你应该使用:this.registerForm.getRawValue(); #stoptobulling 哈哈 :)
【解决方案2】:

在我的猜测中,READONLY 在响应式表单(Angular 2+)中是没有用的。

在普通的基于 HTML、CSS 的项目中

我们使用 READONLY 属性来防止用户键入/选择 表单控件,但我们从输入中获取值。

我们使用 DISABLED 属性来防止用户输入/选择 表单控件,我们没有从输入中获取值。

在基于 Angular 2+ CLI 的项目中

我们不需要 READONLY 属性来阻止用户输入/选择。 因为 DISABLED 属性足以阻止用户输入/选择,而且你 可以从禁用的输入/选择/复选框/单选字段中获取值。

您可以通过模型驱动的方式为字段添加禁用属性

创建 FormGroup 时

this.formGroupName = this.fb.group({
    xyz: [{ value: '', disabled: true }, Validators.required]
});

在运行时

this.formGroupName.get('xyz').disable({ onlySelf: true });

从 FormGroup 中获取值(已编辑)

仅从未禁用的字段中获取值

this.formGroupName.value;

获取FormGroup中所有字段的值

this.formGroupName.getRawValue();

所以在这里你不需要 READONLY 属性。 希望对您有所帮助。

【讨论】:

  • 禁用字段(在反应形式中)的问题是它们没有通过验证。我发现的独特方式是使用只读。
  • @Eric 没有使用 Validation for Disabled 输入。简要介绍一下您对代码的使用。
  • 这成功了,我想禁用输入。 disabled: true 在我的情况下不起作用,但 disable({ onlySelf: true });
  • 这使得该字段被禁用,而不是只读的。所以 CSS 样式不正确。
【解决方案3】:

我们可以使用任何 html 属性并使用 [] 将其绑定到角度。

因此,您可以在该控件中为属性readonly 使用属性绑定

例如

&lt;input type="text" formControlName="xyz" [readonly]="anyBooleanPropertyFromComponent" /&gt;

【讨论】:

  • 问题是如何以模型驱动的方式添加只读字段?请仔细阅读问题
  • 我猜,如何从 JS 代码而不是 html 中做到这一点 就足够了。
  • @Steve 感谢 bt Pankaj 的回答,问题是正确的。我怎样才能以模型驱动的方式做到这一点
【解决方案4】:

对于reactive-forms,如果您想将字段设为只读,一种方法是使用普通的旧javascript,使用:

(document.getElementById('abc') as HTMLInputElement).setAttribute('readonly','true');

除此之外,您还可以将代码转换为更多的打字稿和角度方式。使用@ViewChild 访问元素,然后将readonly 属性设置为true:

HTML

<input [formControl]='data' id='abc' #element [readonly]="data.disabled"/>

TS

@ViewChild('element',{static:true, read: ElementRef}) element : ElementRef ;
(this.element.nativeElement as HTMLInputElement).readOnly = true;

但是,您需要在修改只读属性之前检查 formControl 的状态。

【讨论】:

  • 给我看Can't bind to 'readOnly' since it isn't a known property of 'select'
【解决方案5】:

更新

将表单控件设置为disabled

control = new FormControl({ value: '', disabled: true })

以编程方式enable / disable formcontrol

<button (click)="enable()">Enable</button>
<button (click)="disable()">Disable</button>

disable() {
   this.control.disable()
}

enable() {
   this.control.enable()
}

【讨论】:

    【解决方案6】:

    如果使用表单构建器,使用响应式表单:

    this.customerForm = this.formBuilder.group({
          customerName: [{value: null, disabled: true}, Validators.required],
    })
    

    【讨论】:

      【解决方案7】:

      一个简单的解决方案是将表单控件设置为未禁用:

      this._formBuilder.group({
                  some: new FormControl(
                    {
                      value: parseInt(this.myobject.subObject.stringMember),
                      disabled: false
                    },
                    Validators.required
                  ),
      

      同时,将&lt;input&gt; 和/或&lt;textarea&gt; 设置为只读:

      • 文本区域:
        <label>
          <span class="label">SomeLabel</span>
          <textarea
            maxlength="500"
            formControlName="some"
            readonly>
          </textarea>
        </label>
      
      • 输入:
      <input type="text" formControlName="name" />
      

      这至少适用于输入和文本区域。

      【讨论】:

      • 即使这不是最佳实践,我认为这可以在某些情况下使用。感谢分享!
      • 谢谢,@DarioVogogna 我的回答首先被否决了,因为我还展示了我现在已经删除的一些不良做法;-)
      猜你喜欢
      • 2016-09-12
      • 2018-08-07
      • 2019-09-01
      • 2017-12-19
      • 2019-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多