我有一个通过子代码具有子类别模型的类别模型(工作正常):
var ImageSetCategory = Backbone.Model.extend({
childrenCategories : new Array(),
initialize: function () {
var self = this;
if (this.has('childrenCategories')) {
$.each(this.get('childrenCategories'), function () {
var category = new ImageSetCategory(this);
self.childrenCategories.push(category);
});
}
}
});
我也有一个使用此模型并呈现所有子类别的视图。 (基本上,我正在尝试创建树视图)它使用jquery遍历子类别,实例化其自身的新版本,并将每个子类别作为模型,然后进行渲染。但是我遇到了一个无尽的循环,不断地尝试处理同一模型。
var ImageSetCategoryView = Backbone.View.extend({
tagName: 'li',
className: 'nested-category',
template: Handlebars.templates.imageSetCategoryView,
render: function() {
var self = this;
var templateHtml = this.template(this.model.toJSON());
self.$el.html(templateHtml);
// *****************************
// ENDLESS LOOP
// this is always the same model from the array
// *****************************
$.each(self.model.childrenCategories, function () {
var categoryView = new ImageSetCategoryView({ model: this });
self.$el.children('ul').append(categoryView.render().el);
});
return this;
},
});
为什么这会导致无限循环?我没有遵循最佳做法吗?我的背景是C#,所以我试图以一种OOP的方式来实现这一目标。
最佳答案
原因是ImageSetCategory
的所有实例共享相同的childrenCategories
数组。这样,在ImageSetCategory.initialize
函数中,您可以创建循环引用(ImageSetCategory.childrenCategories
指向数组,而ImageSetCategory.childrenCategories[0]
指向ImageSetCategory
本身)。这使得$.each
中的ImageSetCategoryView.render
遍历同一模型。为了避免这种情况,您应该在ImageSetCategory.initialize
函数内部初始化数组:
var ImageSetCategory = Backbone.Model.extend({
initialize: function () {
var self = this;
this.childrenCategories = [];
if (this.has('childrenCategories')) {
$.each(this.get('childrenCategories'), function () {
var category = new ImageSetCategory(this);
self.childrenCategories.push(category);
});
}
}
});
要了解有关发生这种情况的更多信息,请阅读JavaScript中的原型以及如何将其用于实现面向对象的范例。