2016-11-18 73 views
2

我正在使用Angular 2最终版本。 我在Angular 2中有一个验证器服务。我正在为使用HttpModule的异步验证编写静态方法。所以在这种情况下,如何注入并使用Http,以便我可以调用后端。我试图做出如下声明: static http:http;如何在angular 2最终服务中使用静态方法注入或使用Http?

然后尝试使用静态方法,如ValidationService.http.get() 但这是抛出错误like-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

您可以详细说明解决方案吗?我遇到了与验证服务类似的问题,并且一直遵循本教程[链接](https://coryrylan.com/blog/angular-form-b​​uilder-and-validation-management)为表单创建验证。在向服务注入http时,我得到了未定义的内容。我对静态函数有点不熟悉,不确定这是否是不工作的原因? – 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文件中:在你的OtherStaticClass你写的静态方法

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

而且地方:

SomeStaticClass.angularInjector.get(ValidationService); 
相关问题