2016-02-19 10 views
8

muszę dostęp do mojego niestandardową usługę http od wewnątrz metody statycznej, jak przykładowo:uzyskać dostęp do usługi z niestandardowych walidatora w Angular2

import {Control} from 'angular2/common'; 
import {HttpService} from './http.service'; 

class UsernameValidator { 
    static usernameExist(control: Control): Promise<ValidationResult> { 
     ... /* Access my HTTPservice here */ 
    } 
} 

Jak mogę uzyskać dostęp do usługi w tym przypadku?

+0

mógłbyś położyć większy fragment kodu? – micronyks

+0

Co to jest HTTPService? Dodaj fragment. – micronyks

Odpowiedz

4

Inne podejście polega na zwrocie funkcji. W ten sposób funkcja ta może mieć dostęp do HttpService przykład podany podczas tworzenia:

class UsernameValidator { 
    static createUsernameExist(http:HttpService) { 
    return (control: Control) => { 
     ... /* Access my HTTPservice here */ 
    } 
    } 
} 

można następnie wykorzystać go tak:

validator: UsernameValidator.createUsernameExist(this.httpService) 
+0

Tak. Właśnie tak, że po Günter Zöchbauer odpowiedział :) – Silencer

+0

Przy inicjalizacji FormControl tak: 'login: [ '', [Validators.required, UsernameValidator.createUsernameExist (this.httpService)]]' Otrzymuję błąd " TypeError: UsernameValidator.createUsernameExist nie jest funkcją ", jak to działa? – mdziob

+1

Podążam za tym przykładem i widzę dane wyjściowe dziennika każdego przypadku, ale moje pole jest nigdy nieważne. Jak powinno wyglądać zgłoszenie serwisowe? To właśnie używam. powrotu (kontrola: Control). => { .../* Dostęp mój HttpService tutaj */ \t powrót myService.getStuff() subskrybować (dane => { \t \t if (źle) { \t \t powrót { bad: true} } else { \t return null; } \t} } –

2
class UsernameValidator { 
    constructor(http:HttpService){} 

    usernameExist(control: Control): Promise<ValidationResult> { 
     ... /* Access my HTTPservice here */ 
    } 
} 

następnie stosować jak

validator: new UsernameValidator(http).usernameExist 

The HttpService musi zostać wstrzyknięty do konstruktora, a nie składnik, a następnie przekazywane do utworzonego ręcznie przykład weryfikatorów, jak pokazano powyżej.

+0

Więc muszę utworzyć nowe obiekty dla każdego Async Validator? Czy dobrym pomysłem byłoby zaimplementowanie mojego walidatora, jak wbudowany 'Validators.minLength (12)' i przekazanie http jako parametru? – Silencer

+0

Oczywiście, jeśli użyjesz go jako dyrektywy, wtedy 'HttpService' może być wstrzykiwany bezpośrednio. Zakładałem FormBuilder. –

+0

Dziękuję za odpowiedź, po tym zaimplementowałem to samo, co Thierry, więc przyjąłem jego odpowiedź. – Silencer