2012-04-10 2 views
2

私は、2番目のリクエストが最初のリクエストの結果に依存するバックボーンリクエストをデイジーチェーンしたいと考えています。どのように私はそれを正しい方法で行うのですか? jQuery $.done()は私にとって正しい方法ではないようです。より良い説明のために、ここに仮定的な例があります:Backbone.jsのデイジーチェーンに依存するAJAXリクエスト

私はサプライヤーのリストを持っており、それぞれのサプライヤーは会社に供給する部品のリストを持っています。私はすべてのサプライヤを取得し、このサプライヤのリストのすべての部品を取得したいと思います。ここでは、私が運がなければ使用しようとしているサンプルコードです。何が起こる

var App = {}; 

App.Supplier = Backbone.Model.extend({ }); 
App.Part = Backbone.Model.extend({ }); 

App.Suppliers = Backbone.Collection.extend({ 
    model: App.Supplier 
}); 

App.Parts = Backbone.Collection.extend({ 
    model: App.Part 
}) 

var suppliers = new App.Suppliers; 
var parts = new App.Parts; 

var supplier_request = suppliers.fetch(); 

supplier_request.done(function(){ 
    parts.fetch_by_suppliers([supplier1, supplier2, ...]); 
}); 

は、最初の応答が受信されたとApp.Supplier前のモデルはをインスタンス化された直後に第2の要求火災です。結果は次のとおりです。サプライヤーリストは空のままであり、2番目の要求はサプライヤーの空のリストで起動します。

+0

'suppliers'コレクションの' reset'イベントを聞いてみましたか? ['fetch'](http://documentcloud.github.com/backbone/#Collection-fetch)は、コレクションを取得して再設定した後で呼び出すべきです。 –

+0

これは試してみるとよい考えです。前の2つのリクエストが完了するのを待つ前に、3番目のリクエストを実行する必要があるときに、これは機能しますか? –

+0

リスニングを行っている人によって異なります。ネストされた 'success'コールバックがうまくいくかもしれません。 –

答えて

2

このデイジーチェーンを実現するには、成功コールバックをfetchメソッドに渡す必要があります。 successコールバックには引数として(collection, response)が渡されます。あなたの例のコードは、次のように書き直すことができます。

... 

suppliers.fetch({success: 
    function(collection, response){ 
    parts.fetch_by_suppliers(collection); 
    } 
}); 

Backbone.jsのドキュメントでは、そのことについて説明しています。 http://documentcloud.github.com/backbone/#Collection-fetch

希望はこれを助けよう!

+0

これは私のために働いた。私は '$ .done()'が 'success'と同じことをやろうと思っていたので、ドキュメントを読んだが、試してみたわけではありませんでした。 $ .done()はAJAX応答が受信された直後に起動します(jQueryイベントはBackbone.jsイベントとは別です)。 –