2016-09-15 1 views
19

Up до «окончательного» 2.0 Угловое я сделал это:Угловое 2: Отключить изменение входного сигнала не работает

<input type="text" formControlName="name" [disabled]="!showName"> 

Чтобы динамически отключить/включить форму входа.

После обновления Rc7 до 2.0 я получаю это предупреждение в окне консоли:

It looks like you're using the disabled attribute with a reactive form directive. If you set disabled to true when you set up this control in your component class, the disabled attribute will actually be set in the DOM for you. We recommend using this approach to avoid 'changed after checked' errors.

Я изменил код, чтобы следовать этим инструкциям, как это:

this._userGroupUsersForm = this._formBuilder.group({ 
     'users': [{'', disabled: this.showName}, Validators.compose([Validators.required, Validators.minLength(3), Validators.maxLength(50), Validators.pattern("^[a-zA-ZåäöÅÄÖ 0-9_-]+$")])] 
    }); 

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

toggleName() : void { this.showName = !this.showName; } 

Как я могу это решить?

Примечание: Мой «старый» способ сделать это (путем установки [отключено]) также не работает.

ответ

19

Это должно работать

toggleName() : void { 
    let ctrl = this.form.get('name') 
    ctrl.enabled ? ctrl.disable() : ctrl.enable() 
} 
+1

Он делает! Вы потрясающий сэр. Спасибо!Тем не менее, он все еще жалуется на кнопку отправки, которая выглядит так:

+0

Пожаловаться на. Можете ли вы отправить точную ошибку? –

+0

Жаль об этом. Это то же самое сообщение об ошибке, что и раньше. Наверное, он смотрит на всех [отключенных] и показывает это? –

27

Эта же проблема заставила меня потянуть мои волосы. Моим решением было использование интерполяции, а не односторонней привязки для обновления свойства. В вашем случае, вместо использования:

<input type="text" formControlName="name" [disabled]="!showName">

вы могли бы сделать:

<input type="text" formControlName="name" disabled="{{!showName}}">

Как только я сделал это, я был в состоянии динамически отключить/включить элементы в моих формах.

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

+0

Это не компилируется в Anglar 4: 'Parser Error: имеет интерполяцию ({{}}), где выражение ожидалось' – FelixM

+0

Похоже, что вы можете делать [disabled] = "{{interpolation}}". Разум, обеспечивающий образец вашего кода? Благодаря! –

17

Вы можете попробовать использовать атрибут readonly на своем входе.

инвалидов >>> чтения

<input type="text" formControlName="name" [readonly]="!showName">

3

Если кто-то прокручивает это и принятый ответ (Günters) не работает, как это было не для меня в первую очередь. Возможно, вы пытаетесь использовать его с пользовательским компонентом и не реализовали дополнительный способ setDisabledState(isDisabled: boolean) с интерфейса ControlValueAccessor.

+1

с использованием настраиваемого компонента (для разных типов полей), распространяющего изменения (расширяет ControlValueAccessor). Пробовала интерполяцию, как в предыдущем комментарии, но ваше решение было в моем случае тем, что работало, кажется практичным, просто обновлялось, как создается элемент управления формы (явный конструктор с отключенным атрибутом), и добавлен метод setdisabledStatus, который устанавливает внутреннее отключенное свойство моего пользовательского компонента. Благодарю. – kandan

Смежные вопросы