我继承了用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.在浏览器中显示的把手模板中使用属性。
答案 0 :(得分:0)
这只是对此问题的快速尝试,但您是否尝试过创建ExOb并手动初始化其属性,例如:
self.pushObject(App.ExOb.create({
data1: row.data.data1,
data2: row.data.data2,
... etc ...
});
这可能会更快,因为Ember不必猜测从row.data对象复制到App.ExOb对象的内容。
通常,在我的脑海中创建对象时不需要重载func1()和func2()函数,但是你的要求可能另有规定。