Ember.Object中的多个属性或单个观察者

时间:2014-10-30 18:59:58

标签: javascript ember.js coffeescript computed-properties

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

一个。每个属性:

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')

℃。直接计算道具:

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的简写吗?有什么不同吗?

1 个答案:

答案 0 :(得分:2)

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

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

另外,我不确定这个问题对于SO规则是否可以接受,但我认为无论如何我都会回答。

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

  1. 观察者现在是同步的,但可能并非总是如此。最低限度你应该使用observesImmediately()
  2. 观察者始终处于活动状态,即使未使用这些属性也是如此。如果您使用计算属性,Ember会在何时何时不更新它们时做出明智的决定。