1

有没有办法*知道*何时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')之间调用,那么它会在 之后被缓存,因此以后添加的所有内容都不会显示 - 它需要使缓存无效。extendreopenextendApp.Person.attributes

我尝试使用App.Person.propertyDidChange('attributes'),但这似乎不起作用。我最终要做的是覆盖reopen并手动删除计算属性上的缓存值:

App.Model.reopenClass
  reopen: ->
    result = @_super(arguments...)
    delete Ember.meta(@, 'attributes')['attributes']
    Ember.propertyDidChange(@, 'attributes')
    result

我的问题是,当使用或定义计算实例属性(例如数据库列)时,如何使计算类属性无效(并清除其缓存值) ?emailreopenextend

4

0 回答 0