i have problem defining asynchrous validator in template driven form.
currently have input:
<input type="text" ngcontrol="email" [(ngmodel)]="model.applicant.contact.email" #email="ngform" required asyncemailvalidator>
with validator selector asyncemailvalidator pointing class:
import {provide} "angular2/core"; import {directive} "angular2/core"; import {ng_validators} "angular2/common"; import {validator} "angular2/common"; import {control} "angular2/common"; import {accountservice} "../services/account.service"; @directive({ selector: '[asyncemailvalidator]', providers: [provide(ng_validators, {useexisting: emailvalidator, multi: true}), accountservice] }) export class emailvalidator implements validator { //https://angular.io/docs/ts/latest/api/common/validator-interface.html constructor(private accountservice:accountservice) { } validate(c:control):{[key: string]: any} { let email_regexp = /^[-a-z0-9~!$%^&*_=+}{\'?]+(\.[-a-z0-9~!$%^&*_=+}{\'?]+)*@([a-z0-9_][-a-z0-9_]*(\.[-a-z0-9_]+)*\.(aero|arpa|biz|com|coop|edu|gov|info|int|mil|museum|name|net|org|pro|travel|mobi|[a-z][a-z])|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(:[0-9]{1,5})?$/i; if (!email_regexp.test(c.value)) { return {validateemail: {valid: false}}; } return null; /*return new promise(resolve => this.accountservice.getusernames(c.value).subscribe(res => { if (res == true) { resolve(null); } else { resolve({validateemailtaken: {valid: false}}); } }));*/ }
}
email regex part working expected , form being validated successfuly if regex matching. after want check if e-mail not in use, im creating promise accountservice. doesn't work @ , form in failed state time.
i've read model driven forms , using formbuilder below:
constructor(builder: formbuilder) { this.email = new control('', validators.compose([validators.required, customvalidators.emailformat]), customvalidators.duplicated ); }
which have async validators defined in third parameter of control() not case because im using diffrent approach.
so, question is: possible create async validator using template driven forms?
you try register provider of async validator ng_async_validators
key , not ng_validators
1 (only synchronous validators):
@directive({ selector: '[asyncemailvalidator]', providers: [ provide(ng_async_validators, { // <------------ useexisting: emailvalidator, multi: true }), accountservice ] }) export class emailvalidator implements validator { constructor(private accountservice:accountservice) { } validate(c:control) { return new promise(resolve => this.accountservice.getusernames(c.value).subscribe(res => { if (res == true) { resolve(null); } else { resolve({validateemailtaken: {valid: false}}); } })); } }
see doc on angular.io website:
Comments
Post a Comment