我有一个具有子类别模型的类别模型(工作正常)通过以下代码:
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的方式完成这个。
答案 0 :(得分:2)
原因是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中的原型以及它们如何用于实现面向对象的范例。