Backbone.js视图使用self的实例来呈现子项。这样可以吗?

时间:2014-10-24 08:48:38

标签: backbone.js view architecture

我正在构建一个节点树,其中所有节点都可以有子节点,那些子节点可以有孙子节点,等等......

我可以使用一个视图来躲避它,这反过来会渲染其中的任何一个孩子的模型。我现在看起来像这样:

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),并让它们互相使用以分别渲染子节点。然而,这显然不是很干,如果我不想走这条路,我宁愿不去。

1 个答案:

答案 0 :(得分:1)

这样做完全没问题。这与Marionette的CompositeView非常相似。 Marionette的复合默认行为(如果未定义itemView / childView属性)是使用复合视图本身作为子视图。

https://github.com/marionettejs/backbone.marionette/blob/master/docs/marionette.compositeview.md

我个人自己也使用过这种结构。我有一个分层数据对象,他们需要渲染子视图与容器视图相同(有一些css调整)。

相关问题