反应表单 - 禁用属性

时间:2016-11-08 19:30:59

标签: angular typescript

我正在尝试使用disabled中的formControl属性。当我把它放在模板中时,它可以工作:

<md-input formControlName="id" placeholder="ID" [disabled]="true"></md-input>

但浏览器警告我:

  

看起来您正在使用带有被动形式的disabled属性   指示。如果将disabled设置为true         当您在组件类中设置此控件时,实际上将在DOM中设置disabled属性         您。我们建议使用此方法来避免“检查后更改”错误。

  Example: 
  form = new FormGroup({
    first: new FormControl({value: 'Nancy', disabled: true}, Validators.required),
    last: new FormControl('Drew', Validators.required)
  });

所以我把它放在FormControl中,并从模​​板中删除:

constructor(private itemsService: ItemsService) {
    this._items = [];
    this.myForm = new FormGroup({
        id: new FormControl({value: '', disabled: true}, Validators.required),
        title: new FormControl(),
        description: new FormControl()
    });
    this.id = this.myForm.controls['id'];
    this.title = this.myForm.controls['title'];
    this.description = this.myForm.controls['description'];
    this.id.patchValue(this._items.length);
}

但它不起作用(它不会禁用input)。有什么问题?

19 个答案:

答案 0 :(得分:50)

我一直在使用[attr.disabled]因为我仍然喜欢这个模板驱动而不是程序化的enable()/ disable(),因为它是优秀的IMO。

更改

<md-input formControlName="id" placeholder="ID" [disabled]="true"></md-input>

<md-input formControlName="id" placeholder="ID" [attr.disabled]="true"></md-input>

如果您正在进行更新的材料更改md-inputmat-input

答案 1 :(得分:25)

要解决此问题,您可以尝试这样做。

禁用

this.myForm.controls['id'].disable();

启用

this.myForm.controls['id'].enable();

有关详细信息,请参阅与此相关的github中发布的问题 https://github.com/angular/angular/issues/11271#issuecomment-244507976

答案 2 :(得分:8)

您可以使用以下方法启用/禁用表单控件:

control.disable()或control.enable()

如果这不起作用,可以使用指令

import { NgControl } from '@angular/forms';

@Directive({
  selector: '[disableControl]'
})
export class DisableControlDirective {

  @Input() set disableControl( condition : boolean ) {
    const action = condition ? 'disable' : 'enable';
    this.ngControl.control[action]();
  }

  constructor( private ngControl : NgControl ) {
  }

}

然后你可以像这样使用它

<input [formControl]="formControl" [disableControl]="disable">
<button (click)="disable = true">Disable</button>
<button (click)="disable = false">Enable</button>

此处描述了这种技术:

https://netbasal.com/disabling-form-controls-when-working-with-reactive-forms-in-angular-549dd7b42110

希望有所帮助

答案 3 :(得分:4)

this.form.disable()
this.form.enable()

对于一个formcontrol使其禁用

this.form.get('first').disable()
this.form.get('first').enable()

或初始设置方法。

first: new FormControl({disabled: true}, Validators.required)

答案 4 :(得分:3)

我在角度7中尝试了这些。它成功地工作了。

this.form.controls['fromField'].reset();
if(condition){
      this.form.controls['fromField'].enable();
}
else{
      this.form.controls['fromField'].disable();
}

答案 5 :(得分:2)

Angular-9 中,如果您要禁用/启用按钮单击,则在使用反应式表单时,这是一个简单的解决方案。

在component.ts文件中定义一个函数

//enable example you can use the same approach for disable with .disable()

toggleEnable() {
  this.yourFormName.controls.formFieldName.enable();
  console.log("Clicked")
} 

从您的component.html中调用

例如

<button type="button" data-toggle="form-control" class="bg-primary text-white btn- 
                reset" style="width:100%"(click)="toggleEnable()">

答案 6 :(得分:2)

我发现我需要一个默认值,即使它是一个空字符串也可以使用。所以这个:

this.registerForm('someName', {
  firstName: new FormControl({disabled: true}),
});

...必须成为这个:

this.registerForm('someName', {
  firstName: new FormControl({value: '', disabled: true}),
});

看到我的问题(我不认为这是重复的):Passing 'disabled' in form state object to FormControl constructor doesn't work

答案 7 :(得分:1)

@Input('disableControlDirective') disableControlDirective;
   ngOnChanges(values) {
    if (values['disableControlDirective']) {
      const disableOrEnable = this.disableControlDirective ? 'disable' : 'enable';
      this.ngControl.control[disableOrEnable]();
    }
  }

https://stackoverflow.com/a/60075989/14990860

答案 8 :(得分:1)

创建新的Form控件时,请使用next:

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

如果要更改活动,请使用下一步:

this.variable.enable() 

this.variable.disable()

答案 9 :(得分:1)

就我而言,使用 Angular 8 。我想根据情况切换输入的启用/禁用。

[attr.disabled]对我不起作用,所以这是我的解决方法。

我从HTML和组件函数中删除了[attr.disabled

if (condition) {
    this.form.controls.myField.disabled();
} else {
    this.form.controls.myField.enabled();
}

答案 10 :(得分:1)

使用以下方法初始化(组件)

public selector = new FormControl({value: '', disabled: true});

然后代替使用(模板):

<ngx-select
[multiple]="true"
[disabled]="errorSelector"
[(ngModel)]="ngxval_selector"
[items]="items"
</ngx-select>

只需删除禁用的属性即可:

<ngx-select
[multiple]="true"
[(ngModel)]="ngxval_selector"
[items]="items"
</ngx-select>

如果要显示项目,请启动(在组件中):this.selector.enable();

答案 11 :(得分:0)

这是我的解决方案:

this.myForm = this._formBuilder.group({
    socDate: [[{ value: '', disabled: true }], Validators.required],
    ...
)}

<input fxFlex [matDatepicker]="picker" placeholder="Select Date" formControlName="socDate" [attr.disabled]="true" />

答案 12 :(得分:0)

仅使用反应式的人: 对于本机HTML元素,[attr.disabled]可以使用,但是对于实体元素,我们需要动态禁用该元素。

this.form.get('controlname').disable();

否则它将显示在控制台警告消息中。

答案 13 :(得分:0)

使用[attr.disabled]代替[disabled],在我的情况下,它可以正常使用

答案 14 :(得分:0)

将名称属性添加到您的md输入。如果它没有解决问题,请发布您的模板

答案 15 :(得分:-1)

如果您使用表单验证,则免除禁用mat表单字段,因此请确保您的表单字段没有任何验证,例如(validators.required),这对我有用。 例如:

editUserPhone:新的FormControl({value:'',disabled:true})

这使用户的电话号码不可编辑。

答案 16 :(得分:-1)

响应式表单的优点在于,您可以轻松地捕获任何输入元素的值更改事件,同时可以更改其值/状态。因此,这是使用enable disable解决问题的另一种方法。

这是stackblitz上的完整解决方案。

答案 17 :(得分:-1)

将disable =“ true”添加到html字段 例子:disable

<amexio-text-input formControlName="LastName" disable="true" [(ngModel)]="emplpoyeeRegistration.lastName" [field-label]="'Last Name'" [place-holder]="'Please enter last name'" [allow-blank]="true" [error-msg]="'errorMsg'" [enable-popover]="true" [min-length]="2"
[min-error-msg]="'Minimum 2 char allowed'" [max-error-msg]="'Maximum 20 char allowed'" name="xyz" [max-length]="20">
[icon-feedback]="true">
</amexio-text-input>

答案 18 :(得分:-2)

执行此操作的最终方法。

ngOnInit() {
  this.interPretationForm.controls.InterpretationType.valueChanges.takeWhile(()=> this.alive).subscribe(val =>{
    console.log(val); // You check code. it will be executed every time value change.
  })
}