【发布时间】:2018-08-01 23:41:11
【问题描述】:
我有一个带有appName 属性的服务。当我的组件执行 POST 时,我试图将组件的名称传递给服务的 appName 属性,从而在服务中更新它,以便当服务稍后调用此属性时,它具有我从组件。
但是,我无法更新服务的 appName 属性 - 它与最初在服务中定义的一样:
error-logger.service.ts
constructor(private http: HttpClient) {
};
appName = "initialName";
//logError function fires on error from GlobalErrorHandlerService, logging errors and passing the new appName value from component.
logError() {
//below should log the new appName (from component), not the initial
console.log("Application:" + this.appName);
}
}
my-component.component.ts
import { Component, OnInit } from '@angular/core';
import { ErrorLoggerService } from '../../../core/services/error-logger.service';
import { Router, ActivatedRoute } from '@angular/router';
...
constructor(
private errorLoggerService: ErrorLoggerService,
private route: ActivatedRoute,
private router: Router
) {
console.log("COMPONENT NAME: " + this.route.component.name);
}
ngOnInit() {
this.errorLoggerService.appName = "NewAppName";
this.errorLoggerService.postData(JSON.stringify(myData))
.subscribe(
data => console.warn(data),
error => {throw error},
() => console.log("empty")
);
}
global-error-handler.service.ts
import { Injectable, ErrorHandler, Injector } from '@angular/core';
import {ErrorLoggerService} from '../services/error-logger.service';
import { HttpErrorResponse } from '@angular/common/http';
// Global error handler for logging errors
@Injectable()
export class GlobalErrorHandlerService extends ErrorHandler {
constructor(private injector : Injector) {
super();
}
handleError(error: any) {
let loggerService = this.injector.get(ErrorLoggerService);
loggerService.logError(error)
.subscribe(
data => console.warn(data),
error => {throw error},
() => console.log("empty")
);
}
}
如何从组件中正确更新服务的属性?要么我有一些根本性的错误,要么可能与我在error-logger.service.ts中所做的RXJS/自定义错误处理的异步性质有关。
【问题讨论】:
-
您的服务是如何注册的?它在模块的
providers数组中吗?还是在组件中? -
是的,该服务是全局的,并在
app.module.tsproviders 数组中注册。 -
在哪里调用 logError?
-
我已经更新了我的答案以包含正在调用“logError”的文件。正在从全局
global-error-handler.service.ts文件调用logError,该文件也在app.module.ts中全局注册。这个 global-error-handler 覆盖 Angular 的默认ErrorHandler,代表它提供自定义错误处理。嗯...这让我想,也许我的errorLogger服务在组件传递新属性值之前在global-error-handler.service.ts中被实例化... -
我不熟悉这种语法,所以希望其他人可以加入。但有两种可能性...... 1)不知何故,这种语法提供了服务的多个实例。 2) 你正在失去 this.
标签: angular service dependency-injection error-handling custom-error-handling