0

現在、値をフェッチするコレクションがあり、その後、リセット イベントに関連付けられたすべてのビューが再度レンダリングされます。

問題は、取得したレコードの総数を取得するために別のクエリも発行する必要があり、その ajax 呼び出しが完了した後でのみ、リセット イベントがトリガーされる必要があることです。

少しのコードでより明確になります:

fetch: function() {
  options = { data: this.getParams() };
  this.fetch_total();
  return Backbone.Collection.prototype.fetch.call(this, options);
},

fetch_total: function() {
  var that = this;
  var options = { 
    url: this.url + '/count',
    data: this.getParams(),
    contentType: 'application/json',
    success: function(resp, status, xhr) {
      that.total = parseInt(resp);
      return true;
    }
  };
  return $.ajax(options);
}

ご覧のとおり、エンティティの数を取得するには、get to localhost/myentity/count を発行する必要があります...

問題は、ビューを更新する前に collection.total 変数を更新する必要があることです。つまり、すべてのビューを更新する前に、localhost/myentity への GET と localhost/myentity/count への GET の両方の要求を完了する必要があります...

どうすればそれを達成できますか?

4

3 に答える 3

2

選択した $ が jQuery>1.5 の場合、遅延オブジェクトを利用して、両方の呼び出しが完了したときにリセット イベントを手動でトリガーできます。あなたの答えに似ていますが、もう少し読みやすく、呼び出しを連鎖させません:

fetch: function() {
  options = {silent: true, data: this.getParams()};
  var _this = this;
  var dfd_total = this.fetch_total();
  var dfd_fetch = Backbone.Collection.prototype.fetch.call(this, options);

  return  $.when(dfd_total, dfd_fetch).then(function() {
        _this.trigger('reset', _this);
  })
},

fetch_total: function() {
    // what you have in your question
}

そして、これらの呼び出しをシミュレートする Fiddle http://jsfiddle.net/rkzLn/

もちろん、結果と合計を 1 回のフェッチで返す方が効率的かもしれませんが、それは選択肢ではないと思います。

于 2012-08-14T06:56:54.113 に答える
1

@nikoshrの答えは、APIを変更する必要がないように良い答えだと思います。サーバーへの呼び出しを減らしたいと思う場合は、ページング情報を持つエンドポイントからオブジェクトを返すことを検討してください。

{
  count: 1243,
  page: 3,
  per_page: 10,
  results: [
    ...
  ]
}

次に、コレクションの解析機能をオーバーライドします

parse: function(res) {
  this.count = res.count;
  this.page = res.page;
  this.per_page = res.per_page;
  // return the collection
  return res.results;
}

資力

于 2012-08-14T16:03:58.027 に答える
0

私はそれを行う方法を見つけたと思います。私がしたことは、「リセット」イベントをトリガーせずに、フェッチ呼び出しを静かに起動することでした

そこで、コールバックから、合計のフェッチを発行します (localhost/myentity/count への GET)。

総コールバックから、最終的にリセットイベントをトリガーします

コードでは次のようなものです:

fetch: function() {
  var that = this;
  options = {
    // will manually trigger reset event after fetching the total
    silent: true,       
    data: this.getParams(),
    success: function(collection, resp) {
      that.fetch_total();
    } 
  };
  return Backbone.Collection.prototype.fetch.call(this, options);
},

fetch_total: function() {
  var that = this;
  var options = { 
    url: this.url + '/count',
    data: this.getParams(),
    contentType: 'application/json',
    success: function(resp, status, xhr) {
      that.total = parseInt(resp);
      // manually trigger reset after fetching total
      that.trigger('reset', that);    
      return true;
    }
  };
  return $.ajax(options);
}

これは私の最初の試みです、もっと簡単な方法があるのだろうか

于 2012-08-14T06:32:30.763 に答える