2016-11-22 1 views
1

Ich benutze Angular 2 final Version und versuche für die asynchrone Formularvalidierung. In meinem Komponente Code unten in Konstruktor Ich habe:wie man HTTP-Aufruf innerhalb asynchronen Formvalidierungsmethode in Winkel 2 endgültig machen?

this.myForm = this._formBuilder.group({ 
     'firstName': ['', Validators.compose([Validators.required, Validators.maxLength(45), ValidationService.nameValidator])], 
     'userName': ['', Validators.compose([Validators.required]), Validators.composeAsync([ValidationService.userNameValidator])], 
     'userEmail': ['', Validators.compose([Validators.required, ValidationService.emailValidator])], 
     'confirmEmail': ['', Validators.required], 
     'password': ['', Validators.compose([Validators.required, ValidationService.passwordValidator])], 
     'confirmPassword': ['', Validators.required] 
     }); 

Ich versuche, wie zu überprüfen, ob Benutzername bereits in db über http Aufruf existiert eingegeben.

Validation Methode ist wie folgt:

static userNameValidator(control: FormControl){ 
    let http: Http; 
    if (control.value.trim().length === 0) { 
     return new Promise((resolve, reject) => { 
      resolve(null); 
     }); 
    } 
    if (control.value) { 
     console.log('value:' + control.value); 
     return new Promise((resolve, reject) => { 
      setTimeout(() => { 
       var url = '/isUserNameUnique/';//this is getting printed 
       console.log('url is ' + url); 
       http.get(url + control.value + '/').map(response => response.json()).subscribe(result => { 
        if (result === false) { 
         resolve({'userAlreadyInUse': true}); 
        } else { 
         resolve(null); 
        } 
       }); 
      }, 1000); 
     }); 
    } 
} 

der Konsole ausgegeben erhält. Aber http Anruf wird nicht gemacht. Fehler sagt

Kann jemand mir helfen zu verstehen, was ist das Problem genau?

Antwort

0

Sie haben http nicht verwendet, indem Sie es von der Abhängigkeit nehmen. Ich würde sagen definieren Klasse mit statischen Methode drin. Dann fragen Sie nach http Abhängigkeit in Konstruktor und verwenden Sie es wo immer Sie es wollen.

-Code

@Injectable() 
export class MyClass { 
    constructor(private http: Http) {} 
    static userNameValidator(control: FormControl) { 
    if (control.value.trim().length === 0) { 
     return new Promise((resolve, reject) => { 
     resolve(null); 
     }); 
    } 
    if (control.value) { 
     console.log('value:' + control.value); 
     return new Promise((resolve, reject) => { 
     setTimeout(() => { 
      var url = '/isUserNameUnique/'; //this is getting printed 
      console.log('url is ' + url); 
      //used http as this.http 
      this.http.get(url + control.value + '/').map(response => response.json()) 
      .subscribe(result => { 
      if (result === false) { 
       resolve({ 
       'userAlreadyInUse': true 
       }); 
      } else { 
       resolve(null); 
      } 
      }); 
     }, 1000); 
     }); 
    } 
    } 
} 
+0

i verwendet wie das, was Sie initially- wie mit http im Konstruktor gegeben haben und dann in statischer Methode, weil dies es. Es wird nicht erlaubt. Also stelle ich MyClass.http. Fehler waren nicht da. Aber der selbe Fehler wie 'TypeError: Kann die Eigenschaft' get 'von undefined' nicht lesen. – revathi

+0

@revathi bevor Sie 'MyClass' verwenden, müssen Sie es' Injizable' machen und die statische Methode importieren, wo immer Sie wollen. und dann benutze es. –

+0

ja das habe ich schon gemacht. Meine Klasse ist mit '@Injectable' gekennzeichnet, da es sich um einen Dienst handelt und dieser Dienst für die Komponente importiert wird. Auch der Service und die Komponente werden in den Deklarationen und dem Provider-Array von app.module.ts deklariert. Immer noch kein Sprung. – revathi