Подтвердить что ты не робот

Реактивные формы - отключенный атрибут

Я пытаюсь использовать disabled атрибут из formControl. Когда я помещаю его в шаблон, он работает:

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

Но браузер предупреждает меня:

Похоже, вы используете отключенный атрибут с директивой реактивной формы. Если вы установите для параметра disabled значение true при настройке этого элемента управления в своем классе компонентов, атрибут disabled будет фактически установлен в DOM для вас. Мы рекомендуем использовать этот подход, чтобы избежать ошибок "изменено после проверки".

  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). В чем проблема?

4b9b3361

Ответ 1

Я использовал [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-input для md-input mat-input.

Ответ 2

Чтобы решить эту проблему, вы можете попробовать это.

отключить

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

для включения

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

Для получения дополнительной справки рассмотрите вопрос, опубликованный в github, относящийся к этому https://github.com/angular/angular/issues/11271#issuecom.2-244507976

Ответ 3

Вы можете включить/отключить управление формой, используя следующие методы:

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

Надеюсь, поможет

Ответ 4

Я обнаружил, что мне нужно иметь значение по умолчанию, даже если это была пустая строка для его работы. Итак, это:

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

... должен был стать таким:

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

Смотрите мой вопрос (который я не считаю дубликатом): передача 'отключен' в объекте состояния формы в конструктор FormControl не работает

Ответ 5

Инициализация (компонент) с использованием:

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();

Ответ 6

добавьте атрибут имени к вашему md-вводу. если это не решит проблему, отправьте свой шаблон

Ответ 7

Использовать [attr.disabled] вместо [отключено], в моем случае он работает нормально

Ответ 8

Это было мое решение:

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

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

Ответ 9

add disable = "true" в поле html Пример: отключить

<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>

Ответ 10

Прелесть реактивных форм в том, что вы можете очень легко отследить событие изменения значений любого элемента ввода и в то же время вы можете изменить их значения/статус. Так что вот еще один способ решения вашей проблемы с помощью enable disable.

Вот полное решение по стеку.

Ответ 11

Отключение матовых полей формы освобождается, если вы используете проверку формы, поэтому убедитесь, что в вашем поле формы нет таких проверок, как (validators.required), это сработало для меня. Например:

editUserPhone: новый FormControl ({значение: '', отключено: true})

это делает телефонные номера пользователя недоступными для редактирования.

Ответ 12

Лучший способ сделать это.

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.
  })
}