Ember.Object 中的多个属性或单个观察者
Posted
技术标签:
【中文标题】Ember.Object 中的多个属性或单个观察者【英文标题】:Multiple properties or single observer in Ember.Object 【发布时间】:2014-12-26 23:32:02 【问题描述】:如果我有一系列依赖于同一属性的属性,那么定义它们的最佳(可维护、最快等)方法是什么?我能想到几个:
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 的简写吗?有什么不同吗?
【问题讨论】:
如果您发现任何性能问题,我会先选择 C,然后再转到 B,不过我不会太担心。 【参考方案1】:C 是 A 的简写(尽管是一个小的重定向)。虽然 B 现在可能会给您与 A 和 C 相同的答案,但并不总是能保证这样做。我会不惜一切代价避免 B,因为很难说出价值的来源。如果您的团队对简写感到满意,请使用 C,使用 A 更明确。
但最重要的是,不要担心速度,担心可读性。这样的事情可能是您应该检查性能的最后一件事。
另外,我不确定这个问题是否符合 SO 规则,但我想我还是会回答。
编辑:关于 B 不能保证提供相同的功能,有两个部分。
-
观察者现在是同步的,但可能并不总是如此。至少你应该使用
observesImmediately()
。
观察者始终处于活动状态,即使不使用属性也是如此。如果您改用计算属性,Ember 会明智地决定何时以及何时不更新它们。
【讨论】:
以上是关于Ember.Object 中的多个属性或单个观察者的主要内容,如果未能解决你的问题,请参考以下文章