【问题标题】:Is binding data in template from external object a bad practice?从外部对象绑定模板中的数据是一种不好的做法吗?
【发布时间】:2019-09-13 20:04:13
【问题描述】:

假设我有一个商店(一个大的单例对象),我在其中保存一般应用程序状态。如果需要,此存储将注入到组件中。但是,有些组件只使用商店中的一个属性,并将其用于模板中的条件(当然是只读的)。

这里有首选做法吗?我应该直接从注入的商店使用该属性

class MyComponent {

    constructor(private store: Store) {}
}

// template

<div *ngIf="store.someFlag">...</div>

或者我应该在组件中创建私有属性,然后在模板中使用它?

class MyComponent {

    someFlag: boolean;

    constructor(private store: Store) {
        this.someFlag = store.someFlag;
    }
}

// template

<div *ngIf="someFlag">...</div>

我最关心的是性能 - 从模板中的大对象访问数据会影响 Angular 更改检测周期的性能吗?

【问题讨论】:

    标签: angular data-binding


    【解决方案1】:

    首先,我更喜欢直接使用 store.someFlag ,因为该属性可能会发生变化,并且会立即反映在页面上,而如果将其分配给局部变量,则该变量不会随着时间的推移而改变(除非你做某事)。 如果您计划在本地更改该值并且不希望将更改传播回存储,则分配给变量是有意义的。当我想让我的应用程序日期最初应用于此屏幕时,我会这样做,但屏幕可以更改本地日期并根据用户的喜好强制执行。

    其次,如果您打算在模板中使用 store,请确保在构造函数中将其设为公开(而非私有),因为它不会通过更严格的生产规则。

    class MyComponent {
    
        constructor(public store: Store) {}
    }
    

    【讨论】:

      【解决方案2】:
      class MyComponent {
      
          constructor(public store: Store) {}
      }
      
      // template
      
      <div *ngIf="store.someFlag">...</div>
      

      这将是更好的选择。就好像您制作了该变量的本地副本,然后在更改检测时,您的值从不同的模块/组件更改时可能不会反映在此组件中。

      【讨论】:

        【解决方案3】:

        我想指出我在该方法中看到的另一个问题:您将组件与实现全局状态的方式联系起来。通过这样做,您可以将它们紧密耦合。

        假设您想更改全局状态的结构。例如,您希望将对象在状态层次结构中下移一级。使用您的方法,您将不得不触摸每个组件,可能每个组件多次。

        我会建议让组件尽可能愚蠢。给他们一个他们可以读取或更改为@Input() 的实际对象。让他们努力。当/如果对象更改时添加@Output()

        这样,您可以更清楚地分离关注点:组件只需要知道如何处理一个特定的类,而不是整体状态。

        【讨论】:

        • 但是如果我在所有组件中都需要这种状态,那么维护 /@Input 属性和 /@Output 事件不会变得乏味和复杂吗?
        • 如果它是问题中提到的“大单例对象”,并且您在每个组件中都需要那个大单例对象,我认为架构有问题。在那种情况下,是的,这将是乏味和复杂的,但这只是指向其他地方的问题的指针。
        • 是的,确实所有组件都不需要相同的“大单例对象”,但对于层次结构级别超过 3 的组件则不需要。除了输入/输出之外,还有其他可能的方法可以将数据共享到组件层次结构的 4-5 级吗?
        • 当然,您可以将大部分状态提供给组件。在您必须为具体用例找到最佳选择的情况下,这始终是一种权衡。我会简单地避免将相同的巨型状态对象传递给每个组件,从而失去 a) 灵活性、b) 可测试性、c) 概述。
        猜你喜欢
        • 2017-02-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-11
        • 1970-01-01
        • 1970-01-01
        • 2014-03-29
        • 2020-10-09
        相关资源
        最近更新 更多