2016-02-19 5 views
8

Мне нужно получить доступ к своей таможенной службе HTTP внутри статического метода, в качестве примера:доступ к услуге из пользовательского валидатора в Angular2

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

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

Как я могу доступ к службе в этом случае?

+0

Не могли бы вы положить больше фрагмент кода? – micronyks

+0

Что такое HTTPService? Поместите фрагмент из него. – micronyks

ответ

4

Другой подход заключается в возврате функции. Таким образом, эта функция может иметь доступ к HttpService случая, предусмотренного в процессе создания:

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

Вы можете использовать его так:

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

Да. Я просто сделал это после того, как Günter Zöchbauer ответил :) – Silencer

+0

При инициализации FormControl вот так: 'username: ['', [Validators.required, UsernameValidator.createUsernameExist (this.httpService)]]' Я получаю сообщение об ошибке " TypeError: UsernameValidator.createUsernameExist не является функцией ", как это сделать? – mdziob

+1

Я следую этому примеру, и я вижу вывод журнала каждого случая, но мое поле никогда не действует. Как выглядит вызов службы? Это то, что я использую. Возвращение (контроль: контроль). => { .../* Доступ моего HTTPService здесь */ \t возвращение myService.getStuff (подписка) (данные => { \t \t если (плохое) { \t \t возвращение { bad: true} } else { \t null: } \t} } –

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

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

затем использовать его как

validator: new UsernameValidator(http).usernameExist 

The HttpService необходимо вводить в компонент конструктора вместо этого и затем передается в созданный вручную, например валидатора, как показано выше.

+0

Итак, мне нужно создать новые объекты для каждого асинхронного валидатора? Было бы хорошей идеей реализовать мой валидатор, как встроенный 'Validators.minLength (12)', и передать http как параметр? – Silencer

+0

Несомненно, если вы используете его в качестве директивы, чем 'HttpService', можно вводить напрямую. Я принял FormBuilder. –

+0

Спасибо за ваш ответ, после этого я реализовал то же, что дал Тьерри, поэтому я принял его ответ. – Silencer