有没有办法*知道*何时Ember.Object
在 Ember 的原型上定义属性?
我能够做到这一点并在从以下位置定义属性时得到通知extend
:
App.Model = Ember.Object.extend()
App.Model.reopen Ember.MixinDelegate,
willApplyProperty: (key) ->
didApplyProperty: (key) ->
# 'this' is the prototype
App.Person = App.Model.extend
name: Ember.computed -> 'John'
但这太过分了,基本上是为原型上定义的每个属性创建一个回调。reopen
此外,如果您稍后使用(即didApplyProperty
永远不会调用)添加属性,该策略将不起作用email
:
App.Person = App.Model.extend
name: Ember.computed -> 'John'
App.Person.reopen
email: Ember.computed -> 'example@gmail.com'
在此示例中,目标是能够将这些数据库列附加到类可缓存计算属性App.Person.get('attributes')
.
App.Model.reopenClass
emberFields: Ember.computed(->
map = Ember.Map.create()
@eachComputedProperty (name, meta) ->
if meta.isAttribute
map.set(name, meta)
map
).cacheable()
Ember-data 会这样做,但问题是如果您在andApp.Person.get('attributes')
之间调用,那么它会在 之后被缓存,因此以后添加的所有内容都不会显示 - 它需要使缓存无效。extend
reopen
extend
App.Person.attributes
我尝试使用App.Person.propertyDidChange('attributes')
,但这似乎不起作用。我最终要做的是覆盖reopen
并手动删除计算属性上的缓存值:
App.Model.reopenClass
reopen: ->
result = @_super(arguments...)
delete Ember.meta(@, 'attributes')['attributes']
Ember.propertyDidChange(@, 'attributes')
result
我的问题是,当使用或定义计算实例属性(例如数据库列)时,如何使计算类属性无效(并清除其缓存值) ?email
reopen
extend