骨干收集问题

时间:2014-12-26 03:22:38

标签: backbone.js backbone-collections

我有一个带有3个模型的Backbone App,它有嵌套集合:

模型结构:

Layout extends Backbone.Model
-> sections: new Sections extends Backbone.Collection


Section extends Backbone.Model
-> rows: new Rows extends Backbone.Collection

现在,如果我在布局中有两个剖面模型,并且我将行模型添加到其中一个Section.rows集合中,则会将它添加到两个剖面中。

顺便说一句,我是从一个事件的视角添加它。

先谢谢。

2 个答案:

答案 0 :(得分:0)

得到了解决方法。我可以通过向我的模型添加默认属性来重现您的工作流程。

像这样:

var Section = Backbone.Model.extend({
    defaults: {
        rows: new Rows
    }
});

var Layout = Backbone.Model.extend({
    defaults: {
        sections: new Sections
    }
});

然后真的,如果我将新行添加到我的某个部分的行中,它似乎会添加到所有部分的行集合中。所以我这样做(粗鲁的例子):

var Row = Backbone.Model.extend({
    defaults: {
        rowData: 0
    }
});

var Rows = Backbone.Collection.extend({
    model: Row
});

var Section = Backbone.Model.extend({
    //defaults: {
    //    rows: new Rows
    //}
});

var Sections = Backbone.Collection.extend({
    model: Section
});

var Layout = Backbone.Model.extend({
    //defaults: {
    //    sections: new Sections
    //}
});

var LayoutView = Backbone.View.extend({

});

var lView = new LayoutView({ model: new Layout });
lView.model.set('sections',new Sections());
var sections = lView.model.get('sections');
sections.add({id: 1, name: 's1',rows: new Rows() });
sections.add({id: 2, name: 's2',rows: new Rows() })
var rows = sections.get(1).get('rows');
rows.add({id:'r1',rowsData: 10});
console.log(lView.model.toJSON());

答案 1 :(得分:0)

@aleha你是对的,问题是Model中的默认属性设置。因为它们共享相同的备忘录空间(javascript:通过引用而不是通过值传递)。

所以我所做的就是初始化函数

initialize: function() {
    this.set( 'rows', new Rows() );
}

所以,不需要像上面那样做:

sections.add({id: 1, name: 's1',rows: new Rows() });

因此解决并自动化:)

感谢您的帮助。