グローバル属性に依存するプロパティを作成したい:
App.Test= Em.Object.extend();
App.Test.reopenClass({ all: Em.A() });
App.Other = Em.object.extend({
stuff: function() {
return "calculated stuff from this.get('foo') and App.Test.all";
}.property('foo', 'App.Test.all.@each.bar')
});
回避策として、オブザーバーを作成し、常に新しいランダム値でダミー プロパティを設定して、プロパティの変更をトリガーすることができますが、これを行うより良い方法はありますか?
キャッシングのためにこれが必要です。私は本当にクレイジーでシングルスレッドのバックエンドを持っています。そのため、独自のモデル クラスを作成します。そこで、キャッシュを改善するために、クライアントのロジックを少し再実装しようとしました。
Ive には、Item クラス (App.Item) と、各インスタンスが計算された Item の縮小リストを持つ別のクラスがあります。
App.Model = Em.Object.extend({
});
App.Model.reopenClass({
all: Em.A(),
load: function(hash) {
return this.get('all').pushObject(this.create(hash));
}
});
App.Item = App.Model.extend({
});
App.List = App.Model.extend({
loadedInitItems: false,
items: function() {
if(!this.get('loadedInitItems')) { this.set('loadedInitItems', true); Backend.call('thelist', function(item) { App.Item.load(this); }); }
return App.Item.all.filter(function(item) {
// heavy filter stuff, depends on a lot of propertys on the current list instance
});
}.property('someprops', 'App.Item.all.@each.foo')
});
Backend.call はいくつかの AJAX のものを表します
要点は、フィルタが異なるものを返すように、任意のアイテムを変更できるようになったことです。また、アプリケーションには、ユーザーが項目を追加できる場所が他にもあります。非常に遅いため、バックエンドを再度呼び出したくありません! そして、バックエンドがリストを変更しないことを知っています! だから私はそれをキャッシュしたい。
これは私のユースケースの縮小された例にすぎませんが、要点を説明したと思います。実際には、25000 を超えるオブジェクトで、これを何十回も行っています。