1

Ember.ObjectEmber の のプロトタイプでプロパティが定義されていることを *知る* 方法はありますか?

私はこれを行うことができ、属性がから定義されたときに通知を受け取ることができました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、 for が呼び出されることはありません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

私の質問は、計算されたインスタンス プロパティ(データベースの列など) が または のいずれかを使用して定義されている場合に、計算されたクラス プロパティを無効化 (およびキャッシュされた値をクリア) するにはどうすればよいかということです。emailreopenextend

4

0 に答える 0