【发布时间】:2016-05-29 21:13:50
【问题描述】:
在 Angular 1 中,变更检测是通过对 $scope 层次结构的脏检查来实现的。我们会在模板、控制器或组件中隐式或显式地创建观察者。
在 Angular 2 中,我们不再有 $scope,但我们确实覆盖了 setInterval、setTimeout 等。我可以看到 Angular 如何使用它来触发 $digest,但 Angular 如何确定发生了什么变化,尤其是考虑到 Object.observe 从未进入浏览器?
示例
这是一个简单的例子。服务中定义的对象在 setInterval 中更新。每个间隔都会重新编译 DOM。
Angular 如何判断 AppComponent 正在监视服务,以及服务的属性值发生了变化?
var InjectedService = function() {
var val = {a:1}
setInterval(() => val.a++, 1000);
return val;
}
var AppComponent = ng.core
.Component({
selector: "app",
template:
`
{{service.a}}
`
})
.Class({
constructor: function(service) {
this.service = service;
}
})
AppComponent.parameters = [ new ng.core.Inject( InjectedService ) ];
document.addEventListener('DOMContentLoaded', function() {
ng.platform.browser.bootstrap(AppComponent, [InjectedService])
});
【问题讨论】:
-
@PascalPrecht 听到了你的祈祷! blog.thoughtram.io/angular/2016/02/22/…
-
@EricMartinez - 这确实是一篇非常好的文章 :)
-
关于变更扣除策略 URL 的良好演示 - pascalprecht.github.io/slides/…。对@PascalPrecht 表示感谢 :)