【问题标题】:One-time (not one-way) binding for @Inputs in angular2?angular2中@Inputs的一次性(不是单向)绑定?
【发布时间】:2015-10-25 07:07:52
【问题描述】:

在 Angular 1.x 中,单向数据绑定语法为 ::

我正在尝试通过一次性绑定将对象传递给子组件。孩子需要从父母那里获取初始数据,但父母永远不会改变数据,也不需要知道孩子是否改变了它。

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

如何一次性绑定这个?

【问题讨论】:

  • 不应该是{{::childData}}
  • AFAIK 这个功能还没有实现。但我认为它会在未来......

标签: angular


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    这篇文章:angular 2 one time binding 接缝表明使用 ChangeDetectionStrategy.CheckOnce 可能是解决方案。

    【讨论】:

    • 这会改变整个组件。
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-08-20
      • 1970-01-01
      • 2014-07-17
      • 2016-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-15
      • 2018-03-07
      相关资源
      最近更新 更多