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

Angular2 RC6 отключенный вход

Ранее в моем приложении Angular2 RC5 у меня был элемент ввода, например:

<input type="text" formControlName="blah" disabled/>

Цель заключалась в том, чтобы сделать это поле недоступным для редактирования пользователем в режиме редактирования; следовательно, отключенный атрибут.

После обновления до Angular2 RC6 я получаю следующее сообщение в консоли:

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

Пример:

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

Однако, если я последую этому совету, удалив мой отключенный атрибут и заменив мой FormControl на отключенный набор на true, то это поле не отправляет сообщение при отправке (т.е. оно не отображается в form.value).

Я неправильно закодировал эту ситуацию? Есть ли способ для FormControl, который отключен для включения в значения форм?

В качестве побочного примечания я фактически использую FormBuilder против создания каждого отдельного FormControl, если это имеет значение.

4b9b3361

Ответ 1

Правильный ответ на Angular 2.4.1 и использование FormBuilder как вы

form: FormGroup;

constructor(private fb: FormBuilder) {

}

ngOnInit() {
    this.form = this.fb.group({
      blah: [{ value: '', disabled: true }]
});

и вы можете включить его, позвонив

this.form.get("blah").enable();

или выключить, вызывая

this.form.get("blah").disable();

Однако браузеру не разрешается отправлять элементы, которые отключены. Этот популярный вопрос содержит дополнительную информацию о том, что значения отключенных входов не будут отправлены?

Существуют различные хаки и обходные пути, которые люди придумали, чтобы избежать этого, такие как скрытые поля ввода, атрибут readonly или включение полей перед отправкой.

Ответ 2

Вместо отключенного атрибута в шаблоне вы можете установить "отключенный" экземпляр FormControl на "true".

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

или

blah: FormControl = new FormControl('text');
blah.disabled = true;

Ответ 3

Вы можете попробовать использовать атрибут readonly на вашем входе: <input type="text" [readonly]="true" />

Ответ 4

Вам нужно использовать getRawValue()

см.: Отключено подтверждение ввода в динамической форме

https://angular.io/docs/ts/latest/api/forms/index/FormGroup-class.html#!#getRawValue-anchor

Если вы хотите включить все значения независимо от статуса отказа, используйте этот метод. В противном случае свойство value является наилучшим способом получить значение группы.

Ответ 5

Я в порядке с этим кодом. Если вы хотите отключить this.userForm.controls['UserID'].disable({ onlySelf: true }); если вы хотите включить       this.userForm.controls['UserID'].enable({ onlySelf: false });

Ответ 6

Вот трюк: this.form.getRawValue();, не нужно менять свою модель.

В вашем компоненте получите значение с помощью функции getRawValue, и оно также вернет значения для отключенных элементов управления.

Вот мой метод сохранения для проверки:

save() {       
    let data = this.form.getRawValue();
    if (!this.form.valid)
        return;
    ...................
    ...................
}

Дополнительные сведения см. в двух последних параграфах на странице

Ответ 7

Вы можете сделать это так:

В шаблоне:

<[disabled]="state"/>

В компоненте:

 state:any = true;