抛出异常后,Angular 2不会更新视图

时间:2016-06-15 12:58:45

标签: angular typescript exception

当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,那么我的问题的正确方法是什么?

2 个答案:

答案 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