Javascript Angular2自定义错误处理程序,为什么我可以登录到控制台而不能登录到模板?
我想在我的Angular2应用程序中有自定义错误。因此,我在组件中扩展了ErrorHandler:Javascript Angular2自定义错误处理程序,为什么我可以登录到控制台而不能登录到模板?,javascript,angular,Javascript,Angular,我想在我的Angular2应用程序中有自定义错误。因此,我在组件中扩展了ErrorHandler: import { Component, ErrorHandler, OnInit } from '@angular/core'; import { GenericError } from './generic-error.component'; @Component({ selector: 'custom-error-handler', templateUrl: 'app/err
import { Component, ErrorHandler, OnInit } from '@angular/core';
import { GenericError } from './generic-error.component';
@Component({
selector: 'custom-error-handler',
templateUrl: 'app/error-handler/custom-error-handler.component.html?' + +new Date()
})
export class CustomErrorHandler extends ErrorHandler {
errorText: string;
constructor() {
super(false);
}
ngOnInit() {
this.errorText = 'Initial text!';
}
public handleError(error: any): void {
if (error.originalError instanceof GenericError) {
console.info('This is printed to console!');
this.errorText = "I want it to print this in the template!";
}
else {
super.handleError(error);
}
}
}
throw new GenericError();
我的模板仅包含:
<span style="color:red">{{errorText}}</span>
它用handleError点击代码并打印到控制台,但它不会用以下内容更新我的模板errorText:
“我希望它在模板中打印此内容!”
这就像它忽略了我的模板,当它在handleError函数中时
这里有什么问题
*添加了更多信息*
我想我应该补充一些信息。下面是我为CustomErrorHandler制作的模块(可能是提供者的问题?)
实际上,CustomErrorHandler只有一个实例(我用Augury Chrome插件检查过)
为完整起见,以下是GenericError组件:
export class GenericError {
toString() {
return "Here is a generic error message";
}
}
解决方案是按照问题的评论轨道中的建议添加一项服务。这样我就可以在组件中设置属性,并最终在模板中显示它 我创建了这个服务,这样它就有了一个接受一个参数的函数。注入服务,从组件函数中的handleError调用服务的函数,并在模板中发送我想要的文本作为参数。然后我使用一个可观察的,将文本返回到组件 在组件的构造函数中,我添加了这个观察者
let whatever = this.cs.nameChange.subscribe((value) => {
setTimeout(() => this.errorText = value);
});
我需要添加setTimeout,否则在第二次更改可观察对象之前它不会更新模板
呸!Angular团队应在未来的版本中简化此全局异常处理。您将在哪里包括?我将其包括在我的应用程序组件模板中。听起来,无论您从哪个组件抛出错误,都会创建自己的组件实例。也许可以尝试使用像Augury这样的工具来检查范围层次结构,并确保该组件是抛出错误的组件的子组件。或者可能这需要在服务中,以便更容易在组件之间共享数据。希望这对您有所帮助。您有一个服务实例和一个组件实例。检查调用创建两个不同类的构造函数。一个用于组件,一个用于服务。然后在组件中注入服务。
let whatever = this.cs.nameChange.subscribe((value) => {
setTimeout(() => this.errorText = value);
});