物体上的角度变化检测@Input



我有点了解变化检测在 Angular 2 中的工作原理,但我真的很难将我的 AngularJS 方法转移到 NG2 关于变化检测。

想象一下,我有一个组件,它采用单个@Input() anObject,并且具有单个函数logAllProperties(),为了参数起见,它将所有属性记录到控制台。 我想做的只是在每次对象发生任何更改时调用logAllProperties()。

我知道将对象视为不可变(使用像 Immutable 这样的外部库.js或者通过强制整个对象更改,即使是较小的属性更改)将触发 ngOnChange,但无论如何,每当发生更改时都可以调用函数除了这些或使用 DoCheck,我知道这可能效率极低。

除了"有没有办法",做这样的事情的正确方法是什么?我是 Angular2 的新手,所以我非常乐意学习正确的方法,如果 Immutable 和 Observables 是要走的路。

提前致谢

每次更改对象时执行操作的直接方法是使用 setter 或 ngOnChange(参见 Fals 的答案)。

使用不可变对象和OnPush更改检测策略是提高更改检测性能的一种方法。这不是 Angular 中变化检测最明显的用途。

对于完整的解释,我建议您阅读这篇非常好的文章,如果您有时间(45 分钟),您可以在此处查看文章作者的此视频

从那里,你应该对正在发生的事情有一个很好的了解。

@input

装饰器表示您的组件期望从其父级获取一些数据,这些数据将在该属性中捕获

@output相同的方式是 Angular2 中的装饰器,其中父组件您可以从 Child 中捕获一些东西。

在内部,它使用可观察的,我不认为它是不可变的。

NGRX 提供了一种 redux 类型的不可变机制,其中每个状态都会被记住,您也可以返回到它们。

Observable 和 ngrx 现在并行运行。

我在我们的项目中发现,在某些情况下使用set效果很好,但其他需要在组件之间同步的情况可能会令人不安,那么我们在这些情况下使用ngOnChange。下面是一个示例。

@Input() set myProperty(myProperty: MyPropertyType) {
if (myProperty) {
this.logService.log(myProperty);
}
this._myProperty = myProperty;
}
private _myProperty: MyPropertyType= new MyPropertyType();

关于 Angular2 新生命周期的事情仍然令人困惑,文档示例不适合大多数现实世界的情况。

最新更新