是否可以使用对象ID而不是对象初始化主干集合?

Joe*_*Joe 9 javascript backbone.js backbone.js-collections

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

我希望能够做的是将对象id数组作为初始数据传递给构造函数,并获取Collection以获取它们,可能是批处理,如此.

可行?

sat*_*run 10

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

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

/models/batch/?ids=1,2,3,4
Run Code Online (Sandbox Code Playgroud)

你可以这样做:

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;
    }
});
Run Code Online (Sandbox Code Playgroud)

并像这样使用它:

var coll = new MyCollection({}, {ids: [1, 2, 3, 4]});
Run Code Online (Sandbox Code Playgroud)

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

理论上,这应该工作(阅读:完全未经验证).


Sco*_*ord 7

在初始页面加载时,你不应该使用fetch - 它应该按照reset这里描述的引导程序进行引导:http://documentcloud.github.com/backbone/#FAQ-bootstrap.

从链接:

加载Bootstrapped模型

当您的应用首次加载时,通常会有一组您知道自己需要的初始模型,以便呈现页面.一个更好的模式是将其数据引导到页面中,而不是触发额外的AJAX请求来获取它们.然后,您可以使用reset使用初始数据填充集合.在DocumentCloud中,在工作空间的ERB模板中,我们按照以下几点做了一些事情:

<script>
  Accounts.reset(<%= @accounts.to_json %>);
  Projects.reset(<%= @projects.to_json(:collaborators => true) %>);
</script>
Run Code Online (Sandbox Code Playgroud)