目标是:我有一个parent
模型。它位于一个名为 的集合中parents
。在 aparent
中是一个集合children
。因此,当我实例化parents
集合时,我得到了parent
模型,每个模型中都有集合children
。
我已经尝试了几种不同的方法,并且得到了不同的性能。有时children
根本不出现。有时,它们会在parent
渲染循环的每次迭代中重复。我正在寻求有关执行此操作的最佳做法的帮助。
列表不children
应该改变,每次都应该是同一个集合。我可以稍后即时过滤差异。
我已将其简化为尽可能简单地仅提取数据,没有包含其他额外内容以明确需要发生什么。
我加载了children
两次集合。(嗯,很多次,但一次在parent
集合中,一次在每个parent
模型中)。这样我就可以添加一个新的“父级”并访问子级,这样我就可以在保存之前将它们添加到“父级”模型中。
问题:
- 如何确保只
Children
加载Parent
一次? - 如何将一个
Children
集合加载到Parents
集合中? - 这是正确的方法吗?
楷模:
$(function() {
window.Child = Backbone.Model.extend({});
window.Children = Backbone.Collection.extend({
model: Child
});
window.Parent = Backbone.Model.extend({
initialize: function() {
this.children = new Children();
children.fetch();
}
});
window.Parents = Backbone.Collection.extend({
model: Parent
initialize : function() {
this.childrenAll = new Children();
this.childrenAll.fetch();
}
});
// instantiate the collections
window.parents = new Parents();
});
我的观点:
$(function() {
window.ChildView = Backbone.View.extend({
className: "child-item",
template: _.template($('#child-template').html()),
initialize: function () {
_.bindAll(this, 'render');
this.model.bind('change', this.render);
},
render: function() {
this.$el.html(this.template(this.model.toJSON()));
return this;
}
});
window.ChildrenView = Backbone.View.extend({
className: 'children',
template: _.template($('#children-template').html()),
initialize: function() {
_.bindAll(this, 'render');
this.collection.bind('reset', this.render);
},
render: function() {
this.$el.html(this.template());
this.collection.each(function(child) {
var view = new ChildView({ model:child });
$('.children-list').append(view.render().el);
});
return this;
}
});
window.ParentView = Backbone.View.extend({
className: "parent",
template: _.template($('#parent-template').html()),
initialize: function () {
_.bindAll(this, 'render');
this.model.bind('change', this.render);
},
render: function() {
this.$el.html(this.template(this.model.toJSON()));
this.children = new Children({ collection: children });
$('.children-list').html(this.children.render().el);
return this;
}
});
window.ParentsView = Backbone.View.extend({
el: "#app",
template: _.template($('#parents-template').html()),
initialize: function () {
_.bindAll(this, 'render', 'add');
this.collection.bind('reset', this.render);
},
render: function() {
this.$el.html(this.template());
this.childrenView = new ChildrenView({ collection: children });
$('.children-new').append(this.childrenView.render().el);
this.collection.each(function(parent){
var view = new ParentView({ model: note });
$('#items-list').prepend(view.render().el);
});
return this;
}
});
});
路由器:
$(function() {
window.ParentsRouter = Backbone.Router.extend({
routes: {
'': 'list'
},
initialize: function() {
// starts by assigning the collection to a variable so that it can load the collection
this.parentsView = new ParentsView({
collection: parents
});
parents.fetch({ reset: true });
},
list: function () {
$('#app').empty();
$('#app').append(this.parentsView.render().el);
}
});
window.parentsRouter = new ParentsRouter();
Backbone.history.start();
});