2013-06-22 5 views
6

コレクション全体をロードし、毎回サーバーへのラウンドトリップを行わずに一度に1つずつモデルとして使用するレコードを切り離したい。Model.find()。then()レコードが実際にロードされる前に呼び出される

Ember.Deferredを使用して約束を返す方法を知りましたが、適切なタイミングで解決する約束を得ることができません。次のコードは、単に「発見0」史上時間出力:私はのsetTimeout()で、その後の身体を包む、それは数秒を待たせる場合

App.PersonRoute = Ember.Route.extend({ 
    model: function(params) { 
    var name = "Erik"; 
    var promise = Ember.Deferred.create(); 
    App.people = App.Person.find(); 

    App.people.then(function() { 
     console.log('Found ' + App.people.get('length')); 
     var person = App.people.findProperty('name', name) 
     promise.resolve(person); 
    }); 

    return promise; 
    } 
}); 

、すべてが素晴らしい作品。

何らかの理由でバインドできる別のイベントはありますか?私はApp.people.on( 'isLoaded')を試しましたが、isLoadedは常にtrueです。

ありがとうございます!

答えて

6

私は何とかしてバインドできますか?

実際にあなたが聞くことができるイベントはdidLoadです。

私はApp.people.on( 'isLoaded')を試しましたが、isLoadedは常にtrueです。これについては多くの混乱があったisLoadedについては

、例えばhereを参照してください、混乱はストアがRecordArrayのためのロードが終了したときisLoadedフラグは、設計によって真に設定されているという事実から来ていますたとえ最初にが空の場合でも、レコードは、であり、レコードはローカルではまだ使用できませんでした。その後、サーバーへの要求が戻ってくると、RecordArrayはバックエンドから受け取ったレコードでデータが取り込まれ、バインドが開始され、テンプレートが更新されます。 guidesで述べたように

サーバーからその属性との関係についての情報を受信したされ、及び変更は、クライアント上でローカルに行われていないの両方のロードされた、きれいな手段である記録。

didLoadは火災の原因となりました。

あなたのセットアップに今model lifecycle

下のガイドを見て聞くことができ、よりモデル関連のイベントのために

、あなたはこのような何かにあなたのコードを書き換えることができます:

App.PersonRoute = Ember.Route.extend({ 
    model: function(params) { 
    var name = "Erik"; 
    var promise = Ember.Deferred.create(); 
    App.people = App.Person.find(); 

    App.people.on('didLoad', function() { 
     console.log('Found ' + App.people.get('length')); 
     var person = App.people.findProperty('name', name) 
     promise.resolve(person); 
    }); 

    return promise; 
    } 
}); 

はそれが役に立てば幸い。

2

約束が適切な時期に解決されない場合、私はEmber/dataの(かなり大きな)バグだと思います。 Emberjs/dataのバグを埋めることをお勧めします。

私は、あなたとは異なる約束をしていることが、このバグを引き起こしていると思われます。

App.Person.findはすでに約束を返しています。model()から戻ってくるときには、その約束そのものを使用するべきです。また、その約束を解決するには、単に結果を返すだけです。

Promisesをサポートしていない外部非同期APIを統合する場合、通常使用しているPromisesの実装スタイルが必要です。

私はmodel()のようにリファクタリングします。それは、あなたの非同期タイミングの問題を修正するかもしれません。

App.PersonRoute = Ember.Route.extend({ 
    model: function(params) { 
    var name = "Erik"; 
    var promise = App.Person.find(); 

    promise.then(function() { 
     console.log('Found ' + App.people.get('length')); 
     return App.people.findProperty('name', name) 
    }); 

    return promise; 
    } 
}); 

私は約束を使用するための最良の方法を考え出すときQ library上のドキュメントは非常に有用であることが判明しました。 Emberは別のライブラリであるRSVPを使用しますが、原則は似ています。

関連する問題