2016-11-18 13 views
2

Я использую окончательную версию Angular 2. У меня есть служба валидатора в Angular 2. Я пишу статический метод для асинхронной проверки, который использует HttpModule. Итак, в этом контексте, как вводить и использовать Http, чтобы я мог позвонить в бэкэнд. Я пробовал сделать заявление, как показано ниже: static http: Http;Как вводить или использовать Http внутри статического метода в угловой 2 конечной службе?

затем попытался использовать встроенный статический метод, например ValidationService.http.get() Но это ошибка метаданных as-get не определена.

Может ли кто-нибудь пролить свет на это?

ответ

1
@NgModule(...) 
class AppModule { 
    ngDoBootstrap(moduleRef) { 
    let injector = moduleRef.injector; 
    // assign injector somewhere to a static field 
    } 
} 

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

someStaticMethod() { 
    let validationService = someStatic.injector.get(ValidationService); 
} 

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

+0

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

+0

Можете ли вы подробно остановиться на решении? Я испытываю аналогичную проблему с службой проверки и следую этому руководству [link] (https://coryrylan.com/blog/angular-form-builder-and-validation-management), чтобы создать проверки для формы. При вводе http-сервиса я получаю undefined. Я немного незнакомый со статическими функциями и не уверен, что именно по этой причине он не работает? – PBandJen

+0

Как работает служба проверки, связанная со статическим методом? Возможно, было бы лучше создать новый вопрос, в котором вы добавите код, демонстрирующий то, что вы пытаетесь выполнить. –

0

Я следил за этим сообщением (http://www.adonespitogo.com/articles/angular-2-extending-http-provider/), чтобы расширить класс Http и добавил статический метод, который возвращает однотонный Http.

./services/http.service.ts

import { Injectable, ReflectiveInjector } from '@angular/core'; 
import { 
    BaseResponseOptions, 
    BaseRequestOptions, 
    BrowserXhr, 
    ConnectionBackend, 
    CookieXSRFStrategy, 
    Headers, 
    Http as HttpParent, 
    Request, 
    RequestOptions, 
    RequestOptionsArgs, 
    Response, 
    ResponseOptions, 
    XHRBackend, 
    XSRFStrategy 
} from '@angular/http'; 
import { Observable } from 'rxjs/Observable'; 

@Injectable() 
export class CustomHttp extends HttpParent { 

    public static getInstance() { 
     if (!(this._instance instanceof CustomHttp)) { 
      this._instance = ReflectiveInjector.resolveAndCreate([ 
       CustomHttp, BrowserXhr, XHRBackend, 
       { provide: ConnectionBackend, useClass: XHRBackend }, 
       { provide: ResponseOptions, useClass: BaseResponseOptions }, 
       { provide: XSRFStrategy, useFactory:() => { 
         return new CookieXSRFStrategy(); 
        } 
       }, 
       { provide: RequestOptions, useClass: BaseRequestOptions } 
      ]).get(CustomHttp); 
     } 
     return this._instance; 
    } 

    private static _instance: CustomHttp; 
} 

./app.module.ts

import { NgModule } from '@angular/core'; 
import { HttpModule, RequestOptions, XHRBackend } from '@angular/http'; 
import { CustomHttp } from './services/http.service'; 

@NgModule({ 
    bootstrap: [ 
     AppComponent 
    ], 
    declarations: [ 
     AppComponent 
    ], 
    imports: [ 
     HttpModule 
    ], 
    providers: [ 
     { 
      provide: CustomHttp, 
      useFactory: (backend: XHRBackend, options: RequestOptions) => { 
       return new CustomHttp(backend, options); 
      }, 
      deps: [XHRBackend, RequestOptions] 
     }; 
    ] 
}) 
export class AppModule {} 

./services/validation.service.ts

import CustomHttp from './http.service'; 

export class ValidationService { 
    static public doSomething() { 
     CustomHttp.getInstance().get('some/api/').subscribe(
      (response) => { 
       console.log(response); 
      }) 
    } 
} 

Надеюсь, это сработает для вас.

0

Я использую angular-starter рамки и я получаю доступ к форсунке в src/app/app.module.ts файл в:

@NgModule({ 
    bootstrap: [ AppComponent ], // due this method ngDoBootstrap is never call so we will get injector in constructor. 
    ... 
}) 
export class AppModule 
{ 

    constructor(public appRef: ApplicationRef, 
       public appState: AppState, 
       public injector: Injector) 
    { 
     SomeStaticClass.angularInjector = injector; 
    } 
... 
} 

И где-то в статическом методе вашего OtherStaticClass вы пишете:

SomeStaticClass.angularInjector.get(ValidationService);