Javascript Backbone.js:The;主干。收藏“;类支持不同类型的对象,以及类的工作方式

Javascript Backbone.js:The;主干。收藏“;类支持不同类型的对象,以及类的工作方式,javascript,backbone.js,backbone.js-collections,Javascript,Backbone.js,Backbone.js Collections,通过阅读Addy Osmani编写的名为“Developing Backbone.js Applications”的教科书并尝试一个实用示例,我可以看到Backbone.Collection类的所有元素都可以有不同类型的元素。一个扩展主干的类。集合还可以包含不同类型的元素,就像所有元素不必一致一样 让我向您展示我在示例中使用的代码: var ToDosCollection = new Backbone.Collection(); ToDosCollection.add([ { titl

通过阅读Addy Osmani编写的名为“Developing Backbone.js Applications”的教科书并尝试一个实用示例,我可以看到Backbone.Collection类的所有元素都可以有不同类型的元素。一个扩展主干的类。集合还可以包含不同类型的元素,就像所有元素不必一致一样

让我向您展示我在示例中使用的代码:

var ToDosCollection = new Backbone.Collection();

ToDosCollection.add([
    { title: 'go to Jamaica.', completed: false },
    { task: "aldvjalkdgj", level: 3, timeDue: "6:00 PM Today" }
]);

console.log('Collection size: ' + ToDosCollection.length);
ToDosCollection.reset([
    { slogan: "Curse you, Sephiroth.", population: 5500,},
    { project: "Final Fantasy X" },
    { amount: 500 }
]);

// Above logs 'Collection reset.'
console.log('Collection size: ' + ToDosCollection.length);
alert(JSON.stringify(ToDosCollection.get(0)));

var GitHubRepository = Backbone.Model.extend({
        defaults: {
        nameOfRepository : "",
        owner : "",
        members : [],
        dateCreated : "",
        commits: 0,
        additions: 0,
        deletions: 0,
    },

    initialize : function(){
        this.on("change", function() {
        console.log("CHANGE DETECTED");
    });

    this.on("change:nameOfRepository", function(){
        console.log("The name of the repository has been changed.");
    });

    this.on("change:owner", function(){
        console.log("The owner of the repository has been changed.");
    });

    this.on("change:members", function(){
        console.log("The members this repository belongs to have been changed.");
    });

    this.on("change:dateCreated", function(){
        console.log("The date this repository was created has been changed.");
    });

    this.on("change:commits", function(){
        console.log("The # of commits this repository has have been changed.");
    });

    this.on("change:additions", function(){
        console.log("The # of additions this repository has have been changed.");
    });

    this.on("change:deletions", function(){
        console.log("The # of deletions this repository has have been changed.");
        });
    }
});

var GitHubRepositoryCollection = Backbone.Collection.extend({
    model: GitHubRepository
});

var newCollection = new GitHubRepositoryCollection();

newCollection.add(
    {newObject: new GitHubRepository()},
    {title: "Rabbits"},
    {elementNumber: 5}
);
我理解正确吗?或者,对于一些见解,这实际上是如何工作的?对我来说,我觉得这类似于Java中支持对象的ArrayList实例


编辑:考虑到我在这个问题上至少投了一张反对票,我想问,“Backbone.js中的ItemView是如何工作的?”

为了为集合中的每个模型呈现itemview,我想最好保持每个模型的相似性。否则,您将不得不为每个模型构建不同的itemview,这将增加您编写代码的开销,这并不好,因为我们应该使用主干来呈现要呈现的视图以相同的方式处理相同的数据。如果要渲染不同的itemview,最好使用不同的合成视图或集合视图,这样可以自动执行渲染itemview的任务,从而最终减少开销。

据我所知,特定集合只能包含一组特定模型(就像您的
GitHubRepositoryCollection
)和非特定集合可以包含任何内容。请参见主干文档中的以下内容:“Collection.model:重写此属性以指定集合包含的模型类。如果已定义,您可以传递原始属性对象(和数组)添加、创建和重置,属性将转换为正确类型的模型。“@GregPDesJav Itemview是主干为集合中的每个模型单独呈现的视图,前提是您在集合或集合中给定了Itemview和itemviewcontainercompositeview@nikhilmehta您正在混淆木偶和主干。木偶是主干的视图和架构扩展。主干本身不支持项目视图