在重新打开/重新打开类中的Ember中定义具有特定元的计算属性时的挂钩/事件?

时间:2012-09-13 23:54:24

标签: javascript coffeescript ember.js

在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

定义的

0 个答案:

没有答案