2017-01-28 1 views
2

новичка в angular2 и у меня есть класс, который имеет статические функции в angular2 и я хотел бы осуществить запрос HTTP на одном из статических функций, что являетсяИспользование службы без инъекции в angular2

У меня есть статические классы которые управляют проверки формы

FORM VALIDTION 
this.userform = this._formbuilder.group({ 
    first_name: [this.user.first_name, Validators.required], 
    last_name: ['', Validators.required], 
    username: ['', Validators.compose(
    [ 
     Validators.required,Validators.minLength(5) 
    ] 
)], 
    password: ['',Validators.compose([ 
    Validators.required,ValidationService.passwordValidator 
    ])], 
    email: ['', Validators.compose([ 
    Validators.required,ValidationService.emailValidator 
    ])], 
    role: ['', Validators.required], 

}) 

на ValidationService

constructor(private _http:Http){} 

static passwordValidator(control) { 
    if(control.value != undefined){ 
    if (!control.value.match(/^(?=.*[0-9])[[email protected]#$%^&*]{6,100}$/)) { 
    return { 'invalidPassword': true }; 
    } 
} 

} 

static emailValidator(){ 

return this._http. //this returns an error i would like to 
     //query server to see if email exists 

} 

в моем случае выше, как я могу использовать HTTP в статической функции вероятно, путем присвоения его переменной

То есть let http...

Это используется Here, но это было в RC5 whic терпит неудачу мне

ответ

3

Короткий ответ:

вы не должны делать вещи как это. Внесите свой класс в качестве службы и не используйте статические методы.

Длинный ответ:

Прежде всего, я не считаю, что это было когда-либо работал в RC5.

Во-вторых, если вы не добавляете свой класс в инжектор (вы не передаете его как атрибут конструктора другому сервису/компоненту), вы не должны называть его службой в угловом режиме, хотя это может быть служба в вашем понимание.

В-третьих, статические методы на угловых службах почти не имеют смысла. Да, бывают случаи, когда это может помочь (сервис в угловом2 может иметь более одного экземпляра), однако я считаю, что это не ваше дело.

Если вы хотите использовать угловые услуги (и Httpявляется угловой услуги) вы должны вводить их, как я сказал выше as a constructor attribute to another service/component, что означает, если вы хотите использовать Http вам нужно иметь свой инъекционный сервис.

Так что ответ отрицательный, вы не можете сделать это красиво.

Однако есть обходные пути.

Прежде всего, это просто передать Http экземпляр вашей статической функции:

static emailValidator(http: Http) { 

и в компоненте:

ValidationService.emailValidator(this.http) 

где this.http является Http впрыскивается в компонент.

Другой способ. Сервисы легко создавать самостоятельно.Если служба не имеет запрос не инъекции в конструкторе (ничего не вводить), вы могли бы просто сделать

let myhttp = new Http(); 

Однако первоначальный Http требует две вещи, чтобы быть введены, см https://angular.io/docs/ts/latest/api/http/index/Http-class.html:

constructor(_backend: ConnectionBackend, _defaultOptions: RequestOptions) 

Так вам также необходимо передать в качестве аргумента два других объекта/службы, которые также могут потребоваться для создания экземпляра ... В конце вы пишете свой собственный инжектор.

Третий способ - принять стандартный Угловой инжектор и попытаться поиграть вокруг него.

Все это может работать, но, как разработчик, я буду плакать, если мне понадобится поддерживать такие вещи.

+3

'но, как разработчик, я бы плакать, если я должен был бы поддерживать такие вещи, как that' +1 – Xymanek

+1

хороший ответ smnbbrv, Айв решил изменить валидатор быть сервис, но его хорошо изучить, если есть другие параметры, которые могут пригодиться позже –

+1

Я также надеюсь, что это помогает кому-то, потому что иногда полезно знать эти вещи. Неделю назад у меня была аналогичная проблема: передача экземпляра службы в простой класс и передача его непосредственно в конструктор класса (первый обходной путь) помогли достичь этого. Второй метод обхода очень часто используется для модульного тестирования сервисов, поэтому это также полезно. – smnbbrv

0

Существует способ создания однострочного статического экземпляра. Используйте приведенный ниже код внутри своего сервиса ValidationService. В конструкторе мы присваиваем переменную static экземпляра текущему экземпляру.

Теперь мы можем получить доступ к экземпляру внутри статических методов и динамически использовать службу Http.

static _instance: ValidationService; 
constructor(private _http: Http) { 
    if (!ValidationService._instance) { 
     ValidationService._instance = this; 
    } 

    return ValidationService._instance; 
} 

Внутри вашего использования EmailValidator ниже код:

static emailValidator():Observable<any> { 
    return this._instance._http.get("").map((data) => { 

    }); 

} 

Внутри компонента, где вы хотите использовать ValidationService, впрыснуть ValidationService зависимость и использовать ниже код EmailValidator везде, где требуется.

ValidationService.emailValidator().subscribe((data)=>{ 

}); 
Смежные вопросы