我正在构建一个节点树,其中所有节点都可以有子节点,那些子节点可以有孙子节点,等等......
我可以使用一个视图来躲避它,这反过来会渲染其中的任何一个孩子的模型。我现在看起来像这样:
define(["backbone", "text!templates/node-tree/node.html"], function(Backbone, NodeTmpl) {
var NodeView;
return NodeView = Backbone.View.extend({
className: "node",
template: _.template(NodeTmpl),
initialize: function() {
this.render();
},
render: function() {
this.$el.html(this.template(this.model.toJSON()));
if (this.model.get("children")) {
this.renderChildren();
}
},
renderChildren: function() {
var container = this.el.querySelector(".child-nodes");
for (var i = 0; i < this.model.get("children").length; i++) {
var child = this.model.get("children")[i];
var view = new NodeView({model: child});
container.appendChild(view.el);
}
return this;
}
});
});
现在,这样可以吗?我的意思是我看到它有效,但我是否正在为自己的一些令人讨厌的惊喜做好准备?另一个选项是拥有2个相同的视图类(NodeA,NodeB),并让它们互相使用以分别渲染子节点。然而,这显然不是很干,如果我不想走这条路,我宁愿不去。
答案 0 :(得分:1)
这样做完全没问题。这与Marionette的CompositeView非常相似。 Marionette的复合默认行为(如果未定义itemView / childView属性)是使用复合视图本身作为子视图。
https://github.com/marionettejs/backbone.marionette/blob/master/docs/marionette.compositeview.md
我个人自己也使用过这种结构。我有一个分层数据对象,他们需要渲染子视图与容器视图相同(有一些css调整)。