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')
});

作为一种解决方法,我可以创建一个观察者并始终使用新的随机值设置一个虚拟属性来触发属性更改,但是有没有更好的方法来做到这一点?

我需要这个来进行一些缓存。我有一个非常疯狂的单线程后端。所以我编写了自己的模型类。所以我尝试在客户端重新实现一些逻辑以获得更好的缓存。

我有一个 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 回答