2016-02-23 5 views
4

Я положил recaptcha в регистрационную форму с угловым2. У меня есть контроллер для соответствия recaptcha с требуемым валидатором.Angular2 form disable submit

this.captchaControl = fb.control(false, Validators.required); 
this.userForm = fb.group({ 
    ... 
    captchaControl: this.captchaControl 
}); 

Изначально задано значение true, когда пользователь отвечает на него.

checkReCaptcha(response){ 
    console.log(this.userForm.valid); 
    this.captcha = response; 
    this.captchaControl.updateValue(true); 
    console.log(this.userForm.valid); 
} 

Первый консольный журнал показывает ложь, второй - true.

В кнопку отправки, я поставил отключить функцию:

<button type="submit" [disabled]="!userForm.valid" class="btn btn-d">Register</button> 

но кнопка пребывания Disable.

Как я могу вызвать кнопку, чтобы снова проверить действительность userForm?

Обновление Вот пример моей проблемы. http://plnkr.co/edit/Rwy6Oc5JEEm7yIJYnxJX?p=preview

Когда вы заполняете форму, красная кнопка остается недоступной, даже если форма действительна. Если вы касаетесь любой другой формы ввода (или другой кнопки отправки), отключенная кнопка обновляется и становится доступной, но я ожидаю, что она станет доступной, когда будут определены все входы ...

ответ

4

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

впрыснуть ApplicationRef и вызвать клеща() `после того, как значение было изменено

import {ApplicationRef} from 'angular2/core'; 

constructor(private appRef:ApplicationRef){} 

checkReCaptcha(response){ 
    console.log(this.userForm.valid); 
    this.captcha = response; 
    this.captchaControl.updateValue(true); 
    this.appRef.tick(); 
    console.log(this.userForm.valid); 
} 

Это делает Угловая известно, что обнаружение изменений должно быть сделано.

http://plnkr.co/edit/nYKqtXaaDl69eeL35GTL?p=info

Интересно другого способа вызова обнаружения изменений фактически не работал.

  • SetTimeout (...)
  • ChangeDetectorRef.markForCheck()
  • zone.run (...)

не вызывает новое обнаружение изменений для запуска. По крайней мере, когда я сменил привязку {{userForm.valid}} на {{isUserFormValid()}}, isUserFormValid() не был вызван.

Только this.appRef.tick() сделано Угловое2 пересмотреть привязку.

+0

Я пробовал, но, вероятно, что-то пропустил. добавляю стратегии изменения '@Component ({ changeDetection: ChangeDetectionStrategy.OnPush })' и я мимо строк, которые вы положили, но результат взгляд такой же. Что такое угловая зона? – manu

+1

См. Https://angular.io/docs/ts/latest/api/core/NgZone-class.html, http://blog.thoughtram.io/angular/2016/02/01/zones-in-angular- 2.html, http://victorsavkin.com/post/118372404541/the-core-concepts-of-angular-2.Зона - это обертка. Угловые прогоны, в которых исправляются некоторые API-интерфейсы, чтобы получать уведомления при запуске событий или завершении операций асинхронного сканирования. Это происходит при обнаружении изменения углового пробега. Я рассмотрю этот вопрос. –

+0

Можете ли вы создать Plunker, который демонстрирует проблему? –