【问题标题】:ember computed properties executed whenember 计算属性在何时执行
【发布时间】:2012-09-26 08:05:57
【问题描述】:

我继承了一个用 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() :-) )?

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

【问题讨论】:

    标签: ember.js


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 不幸的是,这在我的要求内是不可能的 :-)
    猜你喜欢
    • 2016-06-27
    • 2016-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-20
    • 2014-05-26
    • 2014-03-01
    相关资源
    最近更新 更多