【发布时间】:2017-08-19 02:18:40
【问题描述】:
我在使用 Angular 4.3.2 中的另一个服务时遇到问题。尝试在 LoggerService 中使用“http”时出现以下错误:无法读取未定义的属性“post”。似乎 Http 服务没有被正确注入,因为它正在另一个服务中使用。如果我直接从组件调用 log 函数,它会按预期工作。
app.module.ts
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { HttpModule } from '@angular/http';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { AppComponent } from './app.component';
import { HomeComponent } from '../home/home.component';
import { CustomerDataLookupComponent } from '../customerdatalookup/customer-data-lookup.component';
import { AppRoutingModule } from './app.routing.module';
import { LoggerService } from './services/logger.service';
@NgModule({
declarations: [
AppComponent,
HomeComponent,
CustomerDataLookupComponent
],
imports: [
// Custom
AppRoutingModule,
// Angular
CommonModule,
HttpModule,
BrowserAnimationsModule
],
providers: [
LoggerService,
CustomerDataLookupRestService
],
bootstrap: [AppComponent]
})
export class AppModule { }
customer-data-lookup-rest.service.ts
import { CustomerDataLookupRestServiceInterface } from '../model/customer-
data-lookup-rest.interface';
import { Observable } from 'rxjs/Rx';
import { CustomerDataLookup } from '../model/customer-data-lookup';
import { RestResponse } from '../../app/model/rest-response';
import { Http } from '@angular/http';
import { environment } from '../../environments/environment';
import { LoggerService } from '../../app/services/logger.service';
import { Injectable } from '@angular/core';
@Injectable()
export class CustomerDataLookupRestService implements CustomerDataLookupRestServiceInterface {
constructor(private http: Http, private loggerService: LoggerService) { }
updateCustomerDataLookup(customerDataLookup: CustomerDataLookup): Observable<RestResponse> {
return this.http
.put(`${environment.configurationRestApiUrl}/CustomerDataLookup/${customerDataLookup.id}`, JSON.stringify(customerDataLookup))
.map(response => response.json() as RestResponse)
.catch(this.loggerService.handleError);
}
logger.service.ts
import { Log } from '../model/log';
import { Http } from '@angular/http';
import { BaseResult } from '../model/base-result';
import { environment } from '../../environments/environment';
import { Observable } from 'rxjs/Rx';
import { Injectable } from '@angular/core';
@Injectable()
export class LoggerService {
constructor(private http: Http) { }
log(log: Log): Observable<BaseResult> {
return this.http.post(`${environment.restApiUrl}/Log/`, JSON.stringify(log))
.map(response => response.json() as BaseResult);
}
handleError(error: Response): Observable<string> {
const errorMessage = 'TEST';
const log = new Log('ERROR', errorMessage);
this.http.post(`${environment.configurationRestApiUrl}/Log/`, JSON.stringify(log))
.map(response => response.json() as BaseResult);
return Observable.throw(errorMessage);
}
}
【问题讨论】:
-
简短回答 - 不是 DRY 但至少可以测试它是否有效,复制第一个组件中的 handlerrror 并删除登录服务注入。长答案,但会简短地说,重新组织你的组件和服务,创建一个新服务只是为了在里面调用 htttp 并在其他两个中删除
-
尝试
.catch(() => this.loggerService.handleError());... 与ecmascript/typescript如何解析本地函数范围有关...
标签: angular