【问题标题】:Angular2 RC2 Expression has changed after it was checked.Angular2 RC2 表达式在检查后发生了变化。
【发布时间】:2016-06-22 20:28:21
【问题描述】:

我从 RC1 更新到 RC2 并收到这条神秘消息 - “表达式在检查后已更改”。代码很简单。
父组件有两个孩子“姐妹”和“兄弟”。在初始化之后,姐姐发出一个分配给父变量的事件,而弟弟的Input() 属性绑定到同一个变量。我认为这是使用父变量的兄弟组件之间的“经典”通信。
它曾经在 RC1 中工作,但不是 RC2。我检查了 CHANGELOG.md,但没有发现任何线索。我究竟做错了什么? http://plnkr.co/edit/HMPAbImpWWeZrVjHyb6H?p=preview

import { Component, Input, Output, EventEmitter } from '@angular/core';

@Component({
      selector: 'brother',
      template:'<h2>Brother has {{present}}</h2>'
})
export class Brother{
  @Input() present: string;
}

@Component({
  selector: 'sister',
  template:'<h2>Sister has {{_present}}</h2>'
})
export class Sister{
  @Output() present: EventEmitter<string> = new EventEmitter; 
  public _present: string = 'something';
  ngOnInit(){
    this.present.emit(this._present);
  }
}

@Component({
  selector: 'my-app',
  template: `
    <div class="container">
      <h2>Parent has {{present}}</h2>
      <brother [present]="present"></brother>
      <sister (present)="present=$event"></sister>
    </div>
  `,
  directives:[Brother,Sister]
})
export class AppComponent {
  public present: string;
}

【问题讨论】:

    标签: angular


    【解决方案1】:

    是的,它已经改变了一点。具体

    fix(facade): 将 EventEmitter 改为默认同步 (#8761)

    https://github.com/angular/angular/commit/e5904f4

    因此,如果您将代码更改为:

    @Output() present: EventEmitter<string> = new EventEmitter; 
    

    到:

    @Output() present: EventEmitter<string> = new EventEmitter(true); 
    

    然后它应该可以工作并且你会得到相同的行为。

    另见https://github.com/angular/angular/blob/master/modules/%40angular/facade/src/async.ts#L152

    http://www.bennadel.com/blog/3071-synchronous-vs-asynchronous-eventemitters-in-angular-2-beta-14.htm

    【讨论】:

    • 魔术。我的问题消失了。能否请您指出一些有关同步/异步等的更多信息?
    【解决方案2】:

    Angular 是从上到下处理模板,先检查兄弟,再检查妹妹。姐妹触发同步事件并在它(兄弟)被检查后立即更改兄弟字段。 Angular 在调试模式下检测到此类错误,在生产模式下,此更改将不会被检测到(模板不会更新),直到下一次检测器通过。您可以更改应用模板中组件的顺序,错误就会消失:

      <sister (present)="present=$event"></sister>
      <brother [present]="present"></brother>
    

    【讨论】:

    • 我过度简化了代码。姐姐和弟弟是对称的。他们两个必须同时排在第一位。这似乎是不可能的。您的解决方法有效!感谢您的宝贵时间。
    • 接受的答案解决了我的问题(我无法更改组件的顺序)。我投了赞成票,因为它理解正在发生的事情。
    猜你喜欢
    • 2017-01-20
    • 2017-12-27
    • 2019-01-05
    • 1970-01-01
    • 2018-11-17
    • 2019-05-29
    • 1970-01-01
    相关资源
    最近更新 更多