One-time(不是one-way)在angular2中绑定@Inputs?

One-time (not one-way) binding for @Inputs in angular2?

在 angular 1.x 中,one-way 数据绑定语法是 ::

我正在尝试将 object 传递给具有 one-time 绑定的 child 组件。 child 需要从 parent 获取初始数据,但 parent 永远不会更改数据,也不需要知道 child 是否更改了它.

<parent [child-data]="childData"/>

我如何one-time绑定它?

这个post: 接缝表示使用ChangeDetectionStrategy.CheckOnce 可能是解决方案。

我知道这是旧的,但我偶然发现了这个:ANGULAR CHANGE DETECTION EXPLAINED 这基本上是说只要你使用 不可变输入和可观察对象 (这可能不是一直都是这种情况,但它可能出现在一些有很多绑定的大表中):

  • ChangeDetectionStrategy.OnPush 组件上的
  • ChangeDetectionStrategy.OnPush 只会在某些 @Input 引用发生变化时(从组件内部或外部)重新呈现整个组件。或者这个组件的模板内部有一些事件。检查我做的这个 plunkr:ChangeDetectionStrategy.OnPush 更改为默认值,然后再次尝试按钮,看看绑定被调用了多少次。 如果您从不更改 @Input,那么您将获得一次性绑定 是的,我知道它适用于整个组件,而不仅仅是特定的绑定....
  • 如果您的数据在其引用未更改的情况下发生更改,请注入 ChangeDetectorRef 并在更改发生时调用 markForCheck

我遇到了同样的问题。在我的例子中,添加一个额外的 Input() set 并仅在旧值尚未设置时保存新值就足够了

 @Input() set initChildData(initChildData: any) {
        if (initChildData && this.childData == undefined) {
            this.childData = initChildData;
        }
    }

然后在 html 中调用 [initChildData] 而不是 [child-data] 您可以在一个组件中为一个输入使用它,或者只是将它移动到抽象 BaseComponent class 以使其更通用