我正在使用Angular 2最终版本。 我在Angular 2中有一个验证器服务。我正在为使用HttpModule的异步验证编写静态方法。所以在这种情况下,如何注入并使用Http,以便我可以调用后端。我试图做出如下声明: static http:http;如何在angular 2最终服务中使用静态方法注入或使用Http?
然后尝试使用静态方法,如ValidationService.http.get() 但这是抛出错误like-get是未定义的。
有人可以对此有所了解吗?
我正在使用Angular 2最终版本。 我在Angular 2中有一个验证器服务。我正在为使用HttpModule的异步验证编写静态方法。所以在这种情况下,如何注入并使用Http,以便我可以调用后端。我试图做出如下声明: static http:http;如何在angular 2最终服务中使用静态方法注入或使用Http?
然后尝试使用静态方法,如ValidationService.http.get() 但这是抛出错误like-get是未定义的。
有人可以对此有所了解吗?
@NgModule(...)
class AppModule {
ngDoBootstrap(moduleRef) {
let injector = moduleRef.injector;
// assign injector somewhere to a static field
}
}
那么你可以使用它像
someStaticMethod() {
let validationService = someStatic.injector.get(ValidationService);
}
你应该尽量避免静态方法虽然。他们反对Angular2s架构。
我跟着这篇文章(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);
})
}
}
我希望这个对你有用。
我用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);
感谢的话,我想我应该改变静态。我想我应该更多地了解这一点。 – revathi
您可以详细说明解决方案吗?我遇到了与验证服务类似的问题,并且一直遵循本教程[链接](https://coryrylan.com/blog/angular-form-builder-and-validation-management)为表单创建验证。在向服务注入http时,我得到了未定义的内容。我对静态函数有点不熟悉,不确定这是否是不工作的原因? – PBandJen
验证服务如何与静态方法相关?在添加代码来演示您想要完成的任务时,创建一个新问题可能会更好。 –