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