0

我继承了一个用 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() 中)都会被调用。

我已经尝试了一些 ember 代码来了解为什么会发生这种情况,但似乎无法模拟这一点。我唯一能看到正在执行的计算属性是当我对该属性执行 get() 时。

任何人都可以告诉我(或指出我错过的文档)何时执行计算的属性函数(除了执行 get() ofcourse :-) )吗?

编辑:到目前为止,我发现执行计算属性的原因如下: 1. 直接调用/使用该属性 2. 在浏览器中显示的车把模板中使用该属性。

4

1 回答 1

0

这只是一个快速解决问题的方法,但您是否尝试过创建 ExOb 并手动初始化其属性,例如:

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

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

一般来说,在我看来,func1() 和 func2() 函数在创建对象时不需要重载,但您的要求可能另有规定。

于 2012-09-26T10:17:45.783 回答