2012-03-19 6 views
1

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

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)で見つけることができます。

何が起こっているのですか?

+0

これはバグと見なすことができ、emberjsの問題追跡でチケットを開くべきだと思います。 –

+1

また、Githubから直接最新バージョンのコードを入手してビルドしてください...最新のディストリビューションをアップロードしてから2ヶ月以上経過している –

答えて

1

燃えさし・データ・ソース・コードは、それをうまく説明:

// 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」

しかし、私は完全にこれはヴァイStore.loadにロードされているモデルに「didLoad」をトリガーするため、変更されるべきであることをあなたに同意かなり明らかです;-)

関連する問題