9

我有一个 Backbone.js 集合,并且我有一个模型 ID 数组,我想填充它。我知道我可以一个一个地获取这些对象,构建一个对象数组并将它们作为数组传递给 Collection 的构造函数。

我想做的是将对象 id 的数组作为初始数据传递给构造函数,并根据this让 Collection 来获取它们,可能作为批处理。

可行吗?

4

3 回答 3

10

当您在 Backbone.Collection 上调用 'fetch' 时,它会依次调用 Backbone.sync,默认情况下它只要求集合使用 url。

因此,如果您的服务器响应:

/models/batch/?ids=1,2,3,4

您可以执行以下操作:

var MyCollection = Backbone.Collection.extend({

    model: Model,

    url: '/models',

    initialize: function(models, options) {
        ids = options.ids || [];
        if (ids.length > 0) { 
            this.fetchByIds(ids);
        }
    },

    fetchByIds: function(ids) {
        // Save a reference to the existing url
        var baseUrl = this.url;

        // Assign our batch url to the 'url' property and call the server
        this.url += '/?ids=' + ids.join(',');
        this.fetch();

        // Restore the 'url' property
        this.url = baseUrl;
    }
});

并像这样使用它:

var coll = new MyCollection({}, {ids: [1, 2, 3, 4]});

您必须在 options 参数中传递 id,因为 Backbone.Collection 构造函数在调用“initialize”函数之前设置第一个参数中传递的模型。

从理论上讲,这应该有效(阅读:完全未尝试过)。

于 2011-08-03T19:54:59.470 回答
7

在初始页面加载时,您不应该使用 fetch - 它应该按照reset此处描述的方式进行引导:http ://documentcloud.github.com/backbone/#FAQ-bootstrap 。

从链接:

加载自举模型

当您的应用首次加载时,通常会有一组您知道您将需要的初始模型来呈现页面。与其触发额外的 AJAX 请求来获取它们,更好的模式是让它们的数据已经引导到页面中。然后,您可以使用 reset 使用初始数据填充您的集合。在 DocumentCloud,在工作区的 ERB 模板中,我们按照以下方式进行操作:

<script>
  Accounts.reset(<%= @accounts.to_json %>);
  Projects.reset(<%= @projects.to_json(:collaborators => true) %>);
</script>
于 2012-03-01T14:57:47.163 回答
3

您实际上也可以将 url 设置为函数。我只是覆盖 fetch 而不是 fetchByIds:另外,我认为 baseUrl 仅适用于模型,而不适用于集合。我认为 rulfzid 有正确的想法,但我想我会这样做:

var MyCollection = Backbone.Collection.extend({
  model: Model,

  initialize: function(models, opts) {
    if (options.ids) {
      this.fetch(options.ids);
    }  
  },

  url: function() {
    var url = '';
    if (this.fetch_ids) {
      // pass ids as you would a multi-select so the server will parse them into
      // a list for you.  if it's rails you'd do: id[]=
      url = '/models?id=' + ids.join('&id=');
      // clear out send_ids
      this.fetch_ids = undefined;
    } else {
      url = '/models';
    }
    return url;
  },

  fetch: function(args) {
    if (args.ids) {
      this.fetch_ids = args.ids;
    }
    return Backbone.Model.prototype.fetch.call(this, args);
  }
});

我认为它将功能保留在适当的“位置”,并且允许更多的可重用性(即,您可以随时 fetch(list_of_ids) ......您不需要新对象)

于 2011-08-04T21:37:14.513 回答