Backbone - 在我的控制器中从一次提取调用中填充多个模型

时间:2014-07-16 00:00:52

标签: javascript backbone.js pagination rendr

假设我有一个需要填充的(例如搜索结果)集合以及需要获取当前页面值,总页数等的分页模型。在我的控制器中,我进行GET调用返回 搜索结果和分页信息的API。那么,我如何获取所有这些信息并将其解析为一个集合和一个单独的模型?这可能吗?

我正在使用AirBNB的Rendr,它允许您使用统一的代码库在服务器和客户端上运行Backbone。 Rendr强迫我将API响应解析为一系列模型,使我无法访问分页信息。

在Rendr中,我的控制器看起来像这样:

module.exports = {
    index: function (params, callback) {
        var spec = {
            pagination: { model: 'Pagination', params: params },
            collection: { collection: 'SearchResults', params: params }
        };
        this.app.fetch(spec, function (err, result) {
            callback(err, result);
        });
    }
}

如果不够明确,我道歉。请随时询问更多信息!

1 个答案:

答案 0 :(得分:2)

这是超级老,所以你现在可能已经把它弄清楚了(或者放弃它)。这是一个与Rendr一样的骨干问题,因为API响应是非标准的。

Backbone建议,如果您有非标准API响应,那么您需要覆盖精确数据格式的解析方法。

如果你真的想要分解它,你可能想要编码的方式是:

  • 分页模型
  • 搜索结果集
  • 搜索结果模型
  • 最重要的是具有自定义解析功能的搜索模型

控制器:

index: function (params, callback) {
    var spec = {
        model: { model: 'Search', params: params }
    };
    this.app.fetch(spec, function (err, result) {
        callback(err, result);
    });
}

搜索模型

var Base = require('./base'),
    _ = require('underscore');

module.exports = Base.extend({
    url: '/api/search',
    parse: function(data) {
        if (_.isObject(data.paginationInfo)) {
            data.paginationInfo = this.app.modelUtils.getModel('PaginationInfo', data.paginationInfo, {
                app: this.app
            });
        }
        if (_.isArray(data.results)) {
            data.results = this.app.modelUtils.getCollection('SearchResults', data.results, {
                app: this.app,
                params: {
                    searchQuery: data.searchQuery // replace with real parameters for client-side caching.
                }
            });
        }
        return data;
    }
});
module.exports.id = 'Search';