0

グローバル属性に依存するプロパティを作成したい:

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 を超えるオブジェクトで、これを何十回も行っています。

4

2 に答える 2

1

プロパティに「バインディング」を追加してから、バインドする値を追加しようとしましたか?, 次のようなもの:

App.PostsController = Em.ArrayController.extend({
  nameOfYourVariableBinding: "App.SomeObject.propertyYouWantToBindTo"
})
于 2013-08-15T19:39:55.873 に答える
0

問題は二重大文字のようです。App.testうまくいきましたが、そうではありませんApp.Foo.test

しかし、ArrayProxy で解決策を見つけることができました。

これについて:

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() {
        var self = this;
        if(!this.get('loadedInitItems')) { 
            this.set('loadedInitItems', true);
            Backend.call('thelist', function(item) {
                App.Item.load(this);
            }); 
        }

        return Em.ArrayProxy.extend({
            content: App.Item.all,
            arrangedContent: function() {
                return this.get('content').filter(function(item) {
                    // heavy filter stuff, depends on a lot of propertys on the current list instance
                    // use self.get('someprops')
                })
            }.property('content.@each.foo')
        });
    }.property('someprops')

    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')
});
于 2013-08-29T14:57:17.600 に答える