4

更改检测已更改。

在 beta.16 之前,如果您的视图包含{{myArray}},如果您不修改数组引用,则该绑定不会更新。例如,如果您将push()项目添加到数组中,则视图不会更新以显示新项目。解释是(嗯,是)因为数组引用没有改变,Angular 变化检测不会重新评估绑定。这个beta.15 plunker演示了这种行为。

从 beta.16(以及因此的 RC.1)开始,情况有所不同。{{myArray}}即使数组引用没有改变,绑定现在也会更新!请参阅此RC.1 plunker

我查看了beta.16 的 ChangeLog,我没有看到任何可以解释这种行为变化的东西(但也许我错过了一些东西)。有谁知道是什么导致了这种变化,还有什么可能会受到影响?

插件代码:

@Component({
  selector: 'child',
  template: `<p>child: {{arr}}`
})
export class Child {
  @Input() arr;
}
@Component({
  selector: 'my-app',
  template: `{{title}} <p>parent: {{arr}}
    <button (click)="modifyArray()">modify array</button>
    <child [arr]="arr"></child>`,
  directives: [Child]
})
export class AppComponent {
  title = "Angular 2 beta.15";  // or "Angular 2 RC.1", as appropriate
  arr = 'one two three'.split(' ');
  modifyArray() {
    this.arr.push('another');
    console.log(this.arr);
  }
}
4

1 回答 1

4

我认为与 DetectChanges 相关的代码已更改(ChangeDetector.detectChangesInRecordsInternal beta.15 vs View.detectChangesInternal rc.1)。你可以在图片中看到它。

Beta.15 堆栈

在此处输入图像描述

在此处输入图像描述

如您所见,有一个数组比较

RC.1 堆栈

在此处输入图像描述

在此处输入图像描述

然后我们可以看到表达式(字符串)的比较,它们是不同的。所以角度 rc.1 将更新视图。

希望它会帮助你:)

于 2016-05-18T15:13:21.490 回答