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 に答える