我很清楚Angular 2中的变化检测是如何工作的,但是我真的很难将我的AngularJS方法转移/更改为关于变化检测的NG2。
想象一下,我有一个组件只需一个 @Input()anObject 并且只有一个函数, logAllProperties() ,为了论证,将所有属性记录到控制台。 我想做的就是每次 时调用 logAllProperties() 无论如何。
我理解将对象视为不可变(使用像Immutable.js这样的外部库或者强制整个对象即使对于次要的属性更改也会更改)将触发ngOnChange,但无论何时更改都会调用函数除了这些或使用DoCheck之外,我理解这可能是非常低效的。
除了"有没有办法",正确做这样的事情的方法是什么?我是Angular2的新手,所以如果不可变和可观察的方式可行,我非常乐意学习正确的方法。
提前致谢
答案 0 :(得分:0)
我在我们的项目中发现使用 set 在某些情况下运行良好,但是其他需要在组件之间同步的情况可能会令人不安,那么我们使用 ngOnChange 那些案子。这是一个例子。
@Input() set myProperty(myProperty: MyPropertyType) {
if (myProperty) {
this.logService.log(myProperty);
}
this._myProperty = myProperty;
}
private _myProperty: MyPropertyType= new MyPropertyType();
关于Angular2新生命周期的事情仍然令人困惑,文档样本并不适合大多数现实案例。
答案 1 :(得分:0)
@input
装饰符表示您的组件期望从其父级获取一些数据,这些数据将在该属性中捕获
同样的方式@output
是angular2中的装饰器,其中父组件可以从子项中捕获。
在内部,它使用了可观察的,我不认为它是不可改变的。
ngrx提供了一个redux类型的不可变机制,每个状态都会被记住,你也可以回到它们。
Observable和ngrx正在并行运行。
答案 2 :(得分:0)
每次更改对象时执行操作的直接方法是使用setter或ngOnChange(请参阅Fals的回答)。
使用不可变对象,OnPush
的变更检测策略是提高变更检测性能的一种方法。这不是Angular中变化检测最明显的用法。
如需完整说明,建议您阅读此really good article,如果您有时间(45分钟),可以查看文章作者here
的视频。从那里,你应该很好地了解正在发生的事情。