ember计算属性执行时

时间:2012-09-26 08:05:57

标签: ember.js

我继承了用Ember 0.9.8.1编写的代码库 在某些情况下,它可能会很慢。 我正在缩小它缓慢的原因。 我注意到了以下内容。

调用ArrayController中的函数来加载数据。 要加载数据,它从后端获取json(快速),然后为每一行创建一个(先前定义的)Ember.Object(慢)并将其推送到ArrayController的content []。

示例:

App.ExOb = Ember.Object.extend({
  data1: null,
  data2: null,
  func1: function () { // statements }.property('data1').cacheable()
  func2: function () { // statements }.property('data2').cacheable()
..etc..
})

App.lotsOfData = Ember.ArrayController.create({
  content: [],
  loaddata: function() { 
    var self=this;
    get_data().forEach(function (row, index) {
       var d = App.ExOb.create(row.data);
       self.pushObject(d);
    }
  }
})

我试图弄清楚为什么Ember.Object的创建和推送很慢。 我注意到的是,在创建对象时(在示例App.ExOb.create()中),对象的每个属性函数(在示例中为func1()和func2())都被调用。

我尝试了一小段余烬代码,看看为什么会发生这种情况,但似乎无法模仿这一点。我能看到正在执行的计算属性的唯一一次是当我执行该属性的get()时。

当执行计算属性函数时,可以告诉我(或指向我错过的文档)(除了执行get()之外的事情: - ))?

编辑: 到目前为止,我发现执行计算属性有以下原因: 1.直接致电/使用酒店 2.在浏览器中显示的把手模板中使用属性。

1 个答案:

答案 0 :(得分:0)

这只是对此问题的快速尝试,但您是否尝试过创建ExOb并手动初始化其属性,例如:

self.pushObject(App.ExOb.create({
    data1: row.data.data1,
    data2: row.data.data2,
    ... etc ...
});

这可能会更快,因为Ember不必猜测从row.data对象复制到App.ExOb对象的内容。

通常,在我的脑海中创建对象时不需要重载func1()和func2()函数,但是你的要求可能另有规定。