在backbone.js中存储和访问视图列表的更好方法是什么?

hxzsmxv2  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(125)

我使用backbone已经有一段时间了,每次我得到视图的动态列表,这些视图有自己的事件和行为,我想知道它们应该如何存储。
1.在内部将视图存储在另一个视图中。这需要适当过滤的开销,但与DOM无关。+可能具有更好的内存使用率
1.只需生成视图,将其放入DOM中,并使用jquery触发视图的事件,如$('#someviewid').trigger('somecustomfunction');-更易于编写和访问,但难以看到依赖关系,而且我不确定如果删除DOM节点是否会删除视图/模型
您有什么建议吗?
这里是扩展的第二个例子,新的视图只是附加到内部html中,而storyView本身被忽略了。但是如果我想访问这个列表中的特定视图,我必须使用DOM属性,比如id或data,然后用jquery访问器触发视图函数

Devclub.Views.StoriesList = Backbone.View.extend({
    initialize: function () {
        this.collection.bind('reset', this.reset, this);
        this.collection.fetch();
    },

    reset: function (modelList) {
        $(this.el).html('');
        var me = this;

        $.each(modelList.models, function (i, model) {
            me.add(model);
        });
    },

    add: function (model) {
        var contact_model = new Devclub.Models.Story(model);
        var view = new Devclub.Views.Story({
            model: contact_model
        });

        var storyView = view.render().el;

        $(this.el).append(storyView);
    }
});

相反,如果我想直接调用一些视图方法,我可以将相同的视图列表存储在一个数组中,并对其进行迭代

gkl3eglg

gkl3eglg1#

我认为你应该保留一份关于孩子观点的参考资料。这里有一个来自阿迪·奥斯马尼的书中的例子。

Backbone.View.prototype.close = function() {
    if (this.onClose) {
        this.onClose();
    }
    this.remove(); };

NewView = Backbone.View.extend({
    initialize: function() {
       this.childViews = [];
    },
    renderChildren: function(item) {
        var itemView = new NewChildView({ model: item });
        $(this.el).prepend(itemView.render());
        this.childViews.push(itemView);
    },
    onClose: function() {
      _(this.childViews).each(function(view) {
        view.close();
      });
    } });

NewChildView = Backbone.View.extend({
    tagName: 'li',
    render: function() {
    } });

相关问题