3

私のバックボーン アプリには、複数のモデルに依存するビューが含まれています。たとえば、次の 2 つのモデルを定義します。

var user = new UserModel({id:1});
user.fetch();
var place = new PlaceModel({id:1});
place.fetch();

ここで、これらの両方のモデルに依存する View をレンダリングしたいと思います。

var home = new House({owner: user, address: place});
home.render()

すべてのモデルがロードされたことを確認するまで、ビューをレンダリングしたくありません。レンダリングする前に両方がフェッチされていることを
確認する正しい方法は何ですか?userplacehome

私は現在、順次プロセスを使用しています:

user.bind("change", function() {place.fetch();});
place.bind("change", function() {home.render();});
user.fetch();

しかし、依存関係が大きくなるにつれてこれは扱いにくくなり、もっと良い方法があるに違いないと感じています...

4

1 に答える 1

5

Backbonefetchは AJAX 呼び出しに jQuery を使用し、通常の呼び出しと同様に、 jQuery Deferredオブジェクト$.ajaxを返します。

これは、次を使用して、複数の呼び出しが終了するのを非常にエレガントに待機できることを意味します $.when

var place = new PlaceModel({id:96});
var user = new UserModel({id:2458});
var home = new House({owner: user, address: place});

//both .fetch() calls return a promise
//when waits for promises to be fulfilled (or rejected)
$.when(place.fetch(), user.fetch())
  .done(home.render);
  .fail(showError);

編集: この回答の以前のバージョンでは、Backbone.localStorage は deferred を返さないと主張していましたが、そうであるため、このソリューションはそのプラグインでも機能します。

于 2012-12-10T21:56:38.670 に答える