Один из способов сделать это - переопределить метод Collection::fetch()
, чтобы он анализировал эти метаданные из ответа.Вы можете сделать так, чтобы ваш сервер возвращал ответ, подобный этому:
{
"collection": [
{ ... model 1 ... },
{ ... model 2 ... },
...
],
"total_rows": 98765,
"pages": 43
}
В вашем методе fetch
, который переопределяет исходный метод Backbone.Collection::fetch()
, вы можете обрабатывать каждое свойство объекта отдельно.Здесь вы можете сделать переопределение с помощью слегка измененного fetch
метода:
_.extend(Backbone.Collection.prototype, {
fetch : function(options) {
options || (options = {});
var collection = this;
var success = options.success;
options.success = function(resp) {
// Capture metadata
if (resp.total_rows) collection.total_rows = resp.total_rows;
if (resp.pages) collection.pages = resp.pages;
// Capture actual model data
collection[options.add ? 'add' : 'refresh'](
collection.parse(resp.collection), options);
// Call success callback if necessary
if (success) success(collection, resp);
};
options.error = wrapError(options.error, collection, options);
(this.sync || Backbone.sync).call(this, 'read', this, options);
return this;
});
Обратите внимание, что этот подход с использованием _.extend
затронет все ваши классы, которые расширяют Backbone.Collection
.
Таким образом, вам не нужно совершать 2 отдельных вызова на сервер.