@Input对象

时间:2017-03-29 20:25:58

标签: javascript angular angular2-changedetection

我很清楚Angular 2中的变化检测是如何工作的,但是我真的很难将我的AngularJS方法转移/更改为关于变化检测的NG2。

想象一下,我有一个组件只需一个 @Input()anObject 并且只有一个函数, logAllProperties() ,为了论证,将所有属性记录到控制台。 我想做的就是每次 时调用 logAllProperties() 无论如何。

我理解将对象视为不可变(使用像Immutable.js这样的外部库或者强制整个对象即使对于次要的属性更改也会更改)将触发ngOnChange,但无论何时更改都会调用函数除了这些或使用DoCheck之外,我理解这可能是非常低效的。

除了"有没有办法",正确做这样的事情的方法是什么?我是Angular2的新手,所以如果不可变和可观察的方式可行,我非常乐意学习正确的方法。

提前致谢

3 个答案:

答案 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

的视频。

从那里,你应该很好地了解正在发生的事情。