typescript - 检查后表达式___发生了变化

标签 typescript angular

为什么这么简单的组件plunk

@Component({
  selector: 'my-app',
  template: `<div>I'm {{message}} </div>`,
})
export class App {
  message:string = 'loading :(';

  ngAfterViewInit() {
    this.updateMessage();
  }

  updateMessage(){
    this.message = 'all done loading :)'
  }
}

throw :

EXCEPTION: Expression 'I'm {{message}} in App@0:5' has changed after it was checked. Previous value: 'I'm loading :( '. Current value: 'I'm all done loading :) ' in [I'm {{message}} in App@0:5]

当我的 View 启动时,我所做的只是更新一个简单的绑定(bind)吗?

最佳答案

正如 drewmoore 所述,在这种情况下,正确的解决方案是手动触发当前组件的变化检测。这是使用 ChangeDetectorRef 对象(从 angular2/core 导入)的 detectChanges() 方法或其 markForCheck() 方法完成的 方法,它也使任何父组件更新。相关example :

import { Component, ChangeDetectorRef, AfterViewInit } from 'angular2/core'

@Component({
  selector: 'my-app',
  template: `<div>I'm {{message}} </div>`,
})
export class App implements AfterViewInit {
  message: string = 'loading :(';

  constructor(private cdr: ChangeDetectorRef) {}

  ngAfterViewInit() {
    this.message = 'all done loading :)'
    this.cdr.detectChanges();
  }

}

这里还有 Plunkers 演示 ngOnInit , setTimeout , 和 enableProdMode以防万一的方法。

关于typescript - 检查后表达式___发生了变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45231339/

相关文章:

javascript - Angular 2 没有 CompilerFactory 的提供者

typescript - 如何防止 Firebase 一遍又一遍地创建同一个用户?

node.js - 在我的模块中的 Nestjs 中导入另一个模块的存储库

javascript - 使用 javascript 扩展 typescript 库

angular - 括号在页面刷新时破坏 Angular 路由

javascript - 如何在数组 typescript 中设置对象

Angular 通用 - TypeError : Converting circular structure to JSON

javascript - Angular - Uncaught ReferenceError : global is not defined with firebase

javascript - 是否有任何 'passive' 方法可以在 Angular2 中动态地从 @ViewChild 样式获取元素样式?

angular - 无法将 "dotnet new angular"创建的应用程序部署到 Azure