2013-02-21 48 views
1

我一直在使用骨幹網很長一段時間,每次我得到動態列表的視圖都有自己的事件和行爲,我不知道應該如何存儲它們。我有兩種方法,我對他們的想法是......什麼是存儲和訪問backbone.js視圖列表的更好方法?

  1. 將視圖內部存儲在另一個視圖中。這需要適當的過濾開銷,但是獨立於DOM +可能有更好的內存使用
  2. 只需生成視圖,將它們放入DOM並使用jquery觸發視圖事件,如$('#someviewid').trigger('somecustomfunction'); - 易於編寫和訪問,但依賴關係很難看到,如果我只是刪除DOM節點,我不確定該視圖/模型會被刪除。

您會推薦什麼?

所以這裏是擴展的第二個例子,其中新的視圖只是附加到內部html和storyViews本身被遺忘。但是,如果我想從這個名單訪問特定的觀點,我將不得不使用DOM屬性,如ID或數據,然後觸發視圖的功能與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); 
    } 
}); 

相反,我可以代替存儲在同一個視圖列表一個數組並重復它,如果我想直接調用一些視圖方法

+0

您能否包含一些代碼?這個問題有點抽象,很難理解,你究竟是什麼意思。 – jevakallio 2013-02-21 11:29:38

+1

查看https://github.com/marionettejs/backbone.marionette上的'CollectionView' ...它的目標是在解決您遇到的問題方面進行詳盡的練習 – 2013-02-21 11:49:35

回答

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() { 
    } }); 
相關問題