Javascript backbone.js-随请求获取额外数据

Javascript backbone.js-随请求获取额外数据,javascript,jquery,ajax,backbone.js,underscore.js,Javascript,Jquery,Ajax,Backbone.js,Underscore.js,我收集了一些用户。需要的一些信息是总共有多少页,多少页,等等。如何将这些信息传递回客户机?或者它们必须来自一个单独的视图,在这种情况下,我需要不止一个ajax调用?我想收集fetch()并接收一些“元数据”。处理此问题的好方法是什么?一种方法是重写Collection::fetch()方法,以便从响应中解析此元数据。您可以让后端返回如下响应: { "collection": [ { ... model 1 ... }, { ... model 2 ...

我收集了一些用户。需要的一些信息是总共有多少页,多少页,等等。如何将这些信息传递回客户机?或者它们必须来自一个单独的视图,在这种情况下,我需要不止一个ajax调用?我想收集
fetch()
并接收一些“元数据”。处理此问题的好方法是什么?

一种方法是重写
Collection::fetch()
方法,以便从响应中解析此元数据。您可以让后端返回如下响应:

{
    "collection": [
        { ... model 1 ... },
        { ... model 2 ... },
        ...
    ],
    "total_rows": 98765,
    "pages":      43
}
在覆盖原始
Backbone.Collection::fetch()
方法的
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
的这种方法将影响所有扩展
主干.Collection
的类


这样,您就不必对后端进行两次单独的调用。

我会在页面创建时引导信息。当服务器创建站点时,将信息写入html文档。就像这样,您根本不需要进行ajax调用。我在ordner中对整个集合执行此操作,而不是首先加载页面,然后等待ajax调用返回所需的信息

Python的代码示例:


第64行:通常,您需要在集合类的解析方法中处理此问题。它的职责是获取响应并返回一组模型属性。但是,如果您不介意解析方法承担这个额外的责任,那么您可以做更多的事情

UserList = Backbone.Collection.extend({

    model: User,

    url: '/users',

    parse: function(data) {
        if (!data) {
            this.registered_users = 0;
            return [];
        }
        this.registered_users = data.registered_users;
        var users = _(data.users).map(
            function(user_data) {
                var user = {};
                user['name'] = user_data.name;
                return user;
            }
        );
        return users;
    }
});
因此,在上面的简单示例中,假设服务器返回一个响应,该响应包含注册用户计数和用户属性数组。您将解析并返回用户属性,然后选择已注册的用户计数,并将其设置为模型上的变量。
解析方法将作为获取的一部分被调用。因此,无需修改fetch,只需使用您拥有的内置hook方法


纯粹主义者会说,您赋予解析方法第二责任,这可能会让一些人感到惊讶(例如,返回某些内容并修改模型状态)。不过,我认为这没关系。

您能提供更多信息吗?您的服务器看起来像什么?您需要支持哪些浏览器?你多久获取一次数据?@tjameson我的服务器只是使用php的nginx。我不需要支持任何特定的浏览器(如果我愿意,我可以只支持chrome和firefox)。我获取数据的频率相对较高(只是crud操作),因此更改页码或进行快速搜索等。我不认为覆盖框架方法是解决此问题的正确方法。相反,您希望使用钩子方法来完成所要求的任务。Parse似乎是一个适合这种事情的地方。重写框架方法会带来这样的危险:当您想要升级backbone.js时,事情可能无法按预期工作,或者您可能无法利用分配给该方法的任何新功能。您是对的,通常不希望影响从框架原型继承的所有方法。出于某种原因,我假设OP希望在所有集合类上都使用此功能,而重写框架方法是一种方便的方法。无论如何,
parse
方法似乎是一个更好的地方。