在Ember的Ember.Object
原型上定义属性时,有没有办法知道*?
我能够执行此操作,并在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执行此操作,但问题是如果您在App.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
我的问题是,当计算出的实例属性时,如何使计算的类属性无效(并清除缓存的值)(例如数据库列{{1} })是使用email
还是reopen
?