1

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

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

你会推荐什么?

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

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

4

1 回答 1

0

我认为你应该保留孩子意见的参考。这是Addy Osmani书中的一个例子。

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() {
    } });
于 2018-01-12T10:30:18.720 回答