2016-02-19 13 views
8

Ich muß innerhalb einer statischen Methode aus meinem benutzerdefinierten HTTP-Dienst zugreifen zu können, wie zB:Zugriff auf einen Dienst von einem benutzerdefinierten Validator in Angular2

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

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

Wie kann ich einen Dienst in diesem Fall zugreifen?

+0

Könnten Sie bitte mehr Schnipsel Ihres Codes setzen? – micronyks

+0

Was ist HTTPService? Schnipsel davon einfügen. – micronyks

Antwort

4

Ein anderer Ansatz besteht darin, eine Funktion zurückzugeben. Auf diese Weise diese Funktion Zugriff auf HttpService Instanz bei der Erstellung zur Verfügung gestellt haben:

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

Sie können es dann so verwenden:

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

Ja. Ich tat das nur, nachdem Günter Zöchbauer antwortete :) – Silencer

+0

Bei der Initialisierung von FormControl wie folgt: 'Benutzername: ['', [Validators.required, UsernameValidator.createUsernameExist (this.httpService)]]' Ich erhalte einen Fehler " TypeError: UsernameValidator.createUsernameExist ist keine Funktion ", wie funktioniert das? – mdziob

+1

Ich folge diesem Beispiel und ich kann die Protokollausgabe jedes Falles sehen, aber mein Feld ist niemals gültig. Wie sollte der Service Call aussehen? Das ist was ich benutze. return (Steuerung: Control). => { .../* Zugriff auf meine Http hier */ \t Rückkehr myService.getStuff() abonnieren (data => { \t \t if (schlecht) { \t \t Rückkehr { schlecht: true} } sonst { \t null zurückgeben; } \t} } –

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

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

verwenden sie dann wie

validator: new UsernameValidator(http).usernameExist 

Die HttpService Bedürfnisse in der Komponente Konstruktor injiziert werden und dann anstatt auf den manuell erzeugten validator Instanz übergeben, wie oben gezeigt.

+0

Also muss ich neue Objekte für jeden Async-Validator erstellen? Wäre es eine gute Idee, meinen Validator wie das eingebaute 'Validators.minLength (12)' zu implementieren und den http als Parameter zu übergeben? – Silencer

+0

Sicher, wenn Sie es als Direktive verwenden, kann der 'HttpService' direkt injiziert werden. Ich habe FormBuilder angenommen. –

+0

Danke für deine Antwort, danach habe ich das gleiche implementiert, was Thierry gab, also habe ich seine Antwort akzeptiert. – Silencer