15

私は2つのことに対するより良い解決策を探しています:

  • データがフェッチされて準備ができているかどうかを理解するにはどうすればよいですBasicDealList.on("reset", function(){})か。データが ajax からフェッチされ、解析され、使用する準備ができているかどうかを理解するために使用しますが、汚れていると感じます。

  • 空の JSON が などのフェッチから取得された場合、{}BasicDealList.length は 1 として表示されますが、0 である必要があるため、最初の要素が空であるかどうかを確認する必要がありましたが、collection.length == 1 && jQuery.isEmptyObject(BasicDealList.toJSON()[0]これは非常に見苦しいものです。

コードは次のとおりです。

BasicDeal = Backbone.Model.extend();    
BasicDealCollection = Backbone.Collection.extend({
    model: BasicDeal,
    url: '/some/ajax/url/',
});
BasicDealList = new BasicDealCollection();

BasicDealList.on("reset", function(collection, response){
    isEmpty = collection.length == 1 && jQuery.isEmptyObject(BasicDealList.toJSON()[0]);
    if (isEmpty){
    // render no deal found html
    }
    else{ 
    // render list of deals
    }
}
BasicDealList.fetch();
4

3 に答える 3

27

をリッスンしたくない場合はreset、コールバックを直接 に渡すことができます.fetch():

BasicDealList.fetch({
    success: function(collection, response){
        // ...
    }
});

アプリの後半で、データを既にフェッチしたかどうかを知りたい場合は、通常、単にBasicDealList.length. サーバー上で実際には空であるコレクションに対して繰り返しリクエストを行うことを避けたい場合は、たとえばフラグを on に設定するなど、カスタム ソリューションを作成する必要があるでしょう.fetch()

BasicDealList.fetch({
    success: function(collection, response){
        BasicDealList.fetched = true;
        // ...
    }
});

[]空のデータの問題については、 ではなくサーバーから戻る必要があります{}。Backbone の Collection はthis.add(models, ...)内で呼び出し、引数が配列かどうか.reset().add()チェックします。modelsそうでない場合は、1 つにラップします。

models = _.isArray(models) ? models.slice() : [models];

したがって、渡す{}modelsset to[{}]になりますが、これは必要なものではありません。サーバーを制御できない場合は{}、カスタム.parse()メソッドでチェックを行い、見つかった場合に返すことができます[]

于 2012-04-04T18:05:39.153 に答える
13

この質問はすでに回答されていますが、別の方法があります。

BasicDealCollection = Backbone.Collection.extend({
    model: BasicDeal,
    url: '/some/ajax/url/',
});

myCollection = new BasicDealCollection()
deferred = myCollection.fetch()

$.when(deferred).then(function() {
  // do stuff when we have the data.
});

これの主な利点は、"when" 関数を使用していることです。「when」関数を使用すると、複数のフェッチ呼び出しをチェックして、1 回成功させることができます。

$.when(deferredOne, deferredTwo, deferredThree).then(function() {
  // do stuff when we have the data.
});

また、遅延オブジェクトを変数に格納すると、このようなことができます。変数は、データを既にロードしたことを知らせるフラグになります。

if (deferred.state() === "resolved") {
    // do stuff when we have the data.
}

コレクションに対して fetch() を呼び出すと、jQuery 遅延オブジェクトが返されます。jQuery 遅延オブジェクトは、「保留中」、「拒否済み」、または「解決済み」の 3 つの状態になる可能性があり、データを取得すると、遅延オブジェクトの状態が解決済みに設定されます。

于 2014-02-20T02:40:38.510 に答える