0

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

我正在使用 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);
        });
    }
}

如果这还不够清楚,我深表歉意。随时询问更多信息!

4

1 回答 1

2

这是超级旧的,所以你现在可能已经想通了(或放弃了它)。由于 API 响应是非标准的,因此这与 Rendr 问题一样是一个主干问题。

Backbone 建议,如果您有一个非标准的 API 响应,那么您需要为您的确切数据格式覆盖 parse 方法。

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

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

控制器:

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';
于 2015-11-01T14:31:39.880 回答