1

如果我有一系列依赖于相同属性的属性,那么定义它们的最佳(可维护、最快等)方法是什么?我能想到几个:

A. 每个属性:

isDraft: (->
  @get('status') is App.Status.DRAFT
).property('status')

isPublished: (->
  @get('status') is App.Status.PUBLISHED
).property('status')

isArchived: (->
  @get('status') is App.Status.ARCHIVED
).property('status')

B. 一次性设置所有道具的观察者:

isDraft: true
isPublished: false
isArchived: false

statusDidChange: (->
  @setProperties(
    isDraft: @get('status') is App.Status.DRAFT
    isPublished: @get('status') is App.Status.PUBLISHED
    isArchived: @get('status') is App.Status.ARCHIVED
  )
).observes('status')

C. 直接计算道具:

isDraft:     Ember.computed.equal('status', App.Status.DRAFT)
isPublished: Ember.computed.equal('status', App.Status.PUBLISHED)
isArchived:  Ember.computed.equal('status', App.Status.ARCHIVED)

(C) 绝对看起来是最优雅的,但我想知道:使用三个计算属性与一个观察者相比有什么惩罚吗?(C) 基本上是 A 的简写吗?有什么区别吗?

4

1 回答 1

2

C 是 A 的简写(虽然是一个小的重定向)。虽然 B 现在可能会给您与 A 和 C 相同的答案,但并不总是保证这样做。我会不惜一切代价避免 B,因为很难说出价值的来源。如果您的团队对速记感到满意,请使用 C,使用 A 更明确。

但最重要的是,不要担心速度,担心可读性。这样的事情可能是您应该检查性能的最后一件事。

另外,我不确定这个问题对于 SO 规则是否可以接受,但我想我还是会回答。

编辑:关于 B 不能保证提供相同的功能,有两个部分。

  1. 观察者现在是同步的,但可能并不总是如此。最低限度你应该使用observesImmediately().
  2. 即使不使用属性,观察者也始终处于活动状态。如果您改用计算属性,Ember 会明智地决定何时以及何时不更新它们。
于 2014-10-30T20:44:37.867 回答