1

私は ember-data に基づいてアプリケーションを作成しています。それはすべてのデータを非同期的にロードします。ただし、didLoad関数は が使用されるまで呼び出されませんfind。例えば:

App = Ember.Application.create();
App.Store = DS.Store.create({revision: 3});
App.Thing = DS.Model.extend({
  didLoad: function(){
    alert("I loaded " + this.get('id'));
  }
});
App.Store.load(App.Thing,{id: "foo"});

...アラートをトリガーせfindAllず、モデルを返しません。ただし、実行すると:

App.Store.find(App.Thing,"foo");

関数がトリガーされ、didLoadで見つけることができますApp.Store.findAll(App.Thing)

どうしたの?

4

1 に答える 1

1

ember-data ソースコードはそれをよく説明しています:

// A record enters this state when the store askes
// the adapter for its data. It remains in this state
// until the adapter provides the requested data.
//
// Usually, this process is asynchronous, using an
// XHR to retrieve the data.

loading: DS.State.create({
  // TRANSITIONS
  exit: function(manager) {
    var record = get(manager, 'record');
    record.fire('didLoad');
  },

  // EVENTS
  didChangeData: function(manager, data) {
    didChangeData(manager);
    manager.send('loadedData');
  },

  loadedData: function(manager) {
    manager.goToState('loaded');
  }
}),

これは、レコードがアダプタ経由でロードされたときにのみ「didLoad」がトリガーされることを意味します。

「find」メソッドはアダプターにデータを要求します。これは、現在利用可能なデータハッシュのプールでそれを検索し、あなたの場合はすでに提供しているため、それを見つけます。ただし、データがブラウザにローカルに存在せず、サーバーに残っている場合もあります。これにより、アダプタで ajax リクエストがトリガーされてフェッチされます。

したがって、「didLoad」は現在、アダプターと組み合わせてのみ機能します (例: find)

しかし、ロードされたモデルで 'didLoad' をトリガーする vai Store.load は非常に明白であるため、これを変更する必要があることに完全に同意します;-)

于 2012-06-02T23:49:51.083 に答える