2015-08-27 1 views
31

В angular2 Я хочу, чтобы триггеры Validator для некоторых элементов управления изменялись при изменении другого элемента управления. Есть ли способ, которым я могу просто передать форму для повторной проверки? Еще лучше, могу ли я запросить проверку определенных полей?Как вызвать валидаторы формы в angular2

Пример: Учитывая Checkbox X и вход P. Вход P имеет валидатор, который ведет себя по-разному в зависимости от модели значения X. Когда X проверяется/бесконтрольно Мне нужно вызвать валидатор на P. валидатор на P рассмотрит модель для определения состояния X и соответственно проверит P.

Вот код:

constructor(builder: FormBuilder) { 
    this.formData = { num: '', checkbox: false }; 

    this.formGp = builder.group({ 
     numberFld: [this.formData.num, myValidators.numericRange], 
     checkboxFld: [this.formData.checkbox], 
    }); 
} 

this.formGp.controls['checkboxFld'].valueChanges.observer({ 
    next: (value) => { 
     // I want to be able to do something like the following line: 
     this.formGp.controls['numberFld'].validator(this.formGp.controls['numberFld']); 
    } 
}); 

Кто-нибудь есть решение? Благодаря!

+0

Вы просто пытаетесь включить/отключить проверку на основе значения X? Какие валидаторы вы используете? Вы можете заставить валидаторы выполнять на основе условия в своей области, но я не уверен, что этот подход будет работать для вас. См. Http://stackoverflow.com/questions/21370006/angular-conditional-email-validation –

+0

@ stephen.vakil - Я использую angular2. – Bonneville

+0

@ Bonneville не могли бы вы объяснить, как вы передаете состояние флажка функции валидатора? –

ответ

34

Я не знаю, если вы все еще ищете ответ, так вот мои предложения:

Посмотрите на это: Angular 2 - AbstractControl

Я думаю, что вы могли бы сделать это следующим образом:

this.formGp.controls['checkboxFld'].valueChanges.observer({ 
    next: (value) => { 
     this.formGp.controls['numberFld'].updateValueAndValidity(); 
    } 
}); 

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

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

EDIT: Обновлено ссылка и пример. Код изменился, когда я писал свой ответ.

EDIT_2: alpha.48 изменяет EventEmitter.observer на EventEmitter.subscribe!

EDIT_3: Изменена ссылка на фактическую реализацию, добавлена ​​ссылка на документы

Validaton-Guide

FormControl Documentation

+0

Спасибо @Nightking за предложение, я попробую. Обратите внимание, что ваша ссылка не работает. – Bonneville

+0

@Bonneville Спасибо за информацию. Они извлекли код формы в общее пространство имен. Вещи меняются немного быстрее :). Я обновил ссылку на источник. – Nightking

+0

Я, наконец, обошел этот код и, похоже, работает для меня. Благодаря! Кстати, в вашем коде есть опечатка: в функции updateValueAndValidity() отсутствует буква «e». У вашего кода есть обновление, а не обновление. Привет, это была большая помощь! – Bonneville

10

с моим ControlGroup я делаю это потому, что у меня есть ошибки дива проверки при прикосновении

for (var i in this.form.controls) { 
    this.form.controls[i].markAsTouched(); 
} 

(это.форма - моя контрольная группа)

4

Есть более элегантные способы моделирования этого поведения - например, помещение вашего состояния в ReplaySubject и наблюдение за ним, а затем использование асинхронных валидаторов, наблюдающих за состоянием, но ниже должен использоваться псевдокодированный подход ниже. Вы просто наблюдаете изменения значений в флажке, обновляете модель по мере необходимости, а затем принудительно повторно проверяете число Fld с помощью updateValueAndValidity cal.

constructor(builder: FormBuilder) { 
    this.formData = { num: '', checkbox: false }; 
    const numberFld = builder.control(this.formData.num, myValidators.numericRange); 

    const checkbox = builder.control(this.formData.checkbox); 
    checkbox.valueChanges.map(mapToBoolean).subscribe((bool) => { 
    this.formData.checked = bool; 
    numberFld.updateValueAndValidity(); //triggers numberFld validation 
    }); 

    this.formGp = builder.group({ 
     numberFld: numberFld, 
     checkboxFld: checkbox 
    }); 
} 
Смежные вопросы