当Angular 2的异常处理程序捕获到异常时,UI不再“更新”。
我有一个非常简单的例子here:
import { Component, ExceptionHandler, Injectable, OnInit, provide } from '@angular/core';
import { bootstrap } from '@angular/platform-browser-dynamic';
import { Subject } from 'rxjs/Subject'
export interface Alert {
message: string;
}
@Component({
selector: 'my-app',
template : `
<h3>Parent</h3>
{{aValue}}
<br/>
<br/>
<button (click)='doIt()'>do it</button>
<br/>
<br/>
<button (click)='breakIt()'>break it</button>
`
})
export class App implements OnInit {
private aValue: boolean = true
constructor() { }
alerts: Alert[] = [];
doIt(){
console.log('Doing It')
this.aValue = !this.aValue
}
breakIt(){
console.log('Breaking It')
throw new Error('some error')
}
}
bootstrap(App).catch(err => console.error(err));
Do It按钮翻转boolean
,它反映在模板中的插值中。但是,一旦按下Break It
按钮(这会导致抛出错误),当按下“执行”按钮时,插值不再更新。但是,控制台仍会记录消息Doing it
。
我正在处理的问题是我想创建一个自定义异常处理程序来警告用户,并且当出现问题时可能会做一些清除表单的工作,但是我看到的是如果我抛出一个按钮上的错误单击以测试它,所有UI更新停止。但是,按钮继续起作用,这意味着如果表单处于良好状态,发布请求的任何按钮都会这样做。然而,用户界面已经停止更新,并告知用户发生了什么。
我不确定这是否是Zones或其他问题,但尝试NgZone.run()
似乎并没有为我解决问题。如果错误意味着破坏组件的UI,那么我的问题的正确方法是什么?
答案 0 :(得分:4)
自角度4.1.1(2017-05-04)https://github.com/angular/angular/commit/07cef36
fix(core):不要因为错误而停止更改检测
- 阻止在错误区域取消订阅
- 阻止取消订阅错误指令
如果出现错误,EventEmitter
- 会阻止在开发模式下分离视图
- 确保
ngOnInit
仅被称为1x(也在prod模式下)
它应该没有额外的代码
@Component({
selector: 'my-app',
template : `
{{aValue}}
<button (click)='doIt()'>do it</button>
<button (click)='breakIt()'>break it</button>
`
})
export class App implements OnInit {
private aValue: boolean = true
doIt(){
console.log('Doing It')
this.aValue = !this.aValue
}
breakIt(){
console.log('Breaking It')
throw new Error('some error')
}
}
<强> Plunker Example 强>
答案 1 :(得分:1)
在未处理的Exception
发生后,不要依赖代码执行。
您必须在预期发生的地方处理异常。
错误处理: http://www.javascriptkit.com/javatutors/trycatch.shtml