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

时间:2013-02-21 11:28:15

标签: backbone.js

我已经使用骨干很长一段时间了,每次我获得有自己的事件和行为的动态视图列表时,我想知道它们应该如何存储。我有两种方式,我对它们的想法是......

  1. 在另一个视图中内部存储视图。这需要适当过滤的开销,但与DOM +无关,可能有更好的内存使用
  2. 只需生成视图,将它们放入DOM并使用jquery触发视图事件,如$('#someviewid').trigger('somecustomfunction'); - 更容易编写和访问,但依赖关系更难以查看,我不确定视图/模型是否会被删除我只是删除DOM节点
  3. 你会推荐什么?

    所以这里是扩展的第二个例子,其中新视图仅附加到内部html并且storyViews本身被遗忘。但是如果我想从这个列表中访问特定的视图,我将不得不使用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);
        }
    });
    

    相比之下,如果我想直接调用某些视图方法,我可以在数组中存储相同的视图列表并迭代它

1 个答案:

答案 0 :(得分:0)

我认为你应该保留对儿童观点的参考。以下是Addy Osmani的book示例。

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() {
    } });