2016-11-18 3 views
2

Ich benutze Angular 2 finale Version. Ich habe einen Validator-Service in Angular 2. Ich schreibe eine statische Methode für die asynchrone Validierung, die HttpModule verwendet. Also in diesem Zusammenhang, wie man Http injiziert und benutzt, damit ich einen Aufruf zum Backend machen kann. Ich habe versucht, eine Erklärung wie folgt zu machen: statische http: Http;Wie injizieren oder verwenden Sie Http innerhalb der statischen Methode in Winkel 2-End-Service?

dann versucht, innerhalb der statischen Methode wie ValidationService.http.get() zu verwenden, aber das Werfen Fehler wie erhalten ist undefined.

Kann jemand etwas Licht hineinwerfen?

Antwort

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

dann können Sie es verwenden, wie

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

sollten Sie versuchen, obwohl statische Methoden zu vermeiden. Sie sind gegen Angular2s Architektur.

+0

Danke, dann ich denke, Ich sollte die statische ändern. Ich denke, ich sollte mehr darüber googlen. – revathi

+0

Können Sie die Lösung näher erläutern? Ich habe ein ähnliches Problem mit dem Validierungsdienst und befolge dieses Tutorial [link] (https://coryrylan.com/blog/angular-form-builder-and-validation-management), um Validierungen für ein Formular zu erstellen. Wenn ich http in den Dienst einfüge, werde ich undefiniert. Ich bin ein wenig mit statischen Funktionen nicht vertraut und nicht sicher, ob das der Grund ist, warum es nicht funktioniert? – PBandJen

+0

Wie bezieht sich ein Validierungsservice auf die statische Methode? Es ist möglicherweise besser, eine neue Frage zu erstellen, in der Sie den Code hinzufügen, der zeigt, was Sie erreichen möchten. –

0

Ich folgte diesem Beitrag (http://www.adonespitogo.com/articles/angular-2-extending-http-provider/), um die Http-Klasse zu erweitern und eine statische Methode hinzugefügt, die ein Singleton von Http zurückgibt.

./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); 
      }) 
    } 
} 

Ich hoffe es funktioniert für dich.

0

Ich benutze angular-starter Rahmen und ich erhalte Zugang zu Injektor in src/app/app.module.ts Datei in:

@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; 
    } 
... 
} 

Und irgendwo in der statischen Methode Ihrer OtherStaticClass Sie schreiben:

SomeStaticClass.angularInjector.get(ValidationService); 
Verwandte Themen