【发布时间】:2016-06-15 12:58:44
【问题描述】:
当 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 更新都会停止。但是,按钮继续起作用,这意味着如果表单处于良好状态,任何发布请求的按钮都会这样做。然而,UI 已停止更新并通知用户正在发生的事情。
我不确定这是区域问题还是其他问题,但尝试NgZone.run() 似乎并没有为我解决问题。如果错误是为了破坏组件的 UI,那么解决我的问题的正确方法是什么?
【问题讨论】:
-
有趣。我看到的不同之处在于错误是由子组件引发的,并且他的 plunker 的视图继续更新。这是否意味着我只需要尝试...捕获父组件,所有子组件错误都不会导致视图中断?
-
我认为做出一般性陈述并不容易。这总是取决于从哪里调用抛出的代码,以及如果调用了某些代码但没有以预期路径完成,是否会破坏任何东西。
-
注明。不过,在我对这个假设的测试中,它似乎是正确的。我想我有一条前进的道路......可能是一个包装其他所有内容的父组件,并充当错误处理的最后一道防线。
标签: angular typescript exception