2011-11-29 75 views
3

我正在通過一個教程來學習如何使用Backbone.js,並且我很難理解Backbone視圖如何「看到」這個集合。Backbone.js - View如何查找此集合?

下面是視圖代碼,下面是集合代碼。

我可以看到變量$ albums被分配給元素內的特定類'.albums',但我不明白這個代碼是如何引用'this.collection'的。

視圖和集合都從標準的Backbone.View和Backbone.Collection類擴展而來。只是看着它,我看不出他們甚至知道彼此存在。我假設「this」這個詞是指這個特定的LibraryView實例。

我想這是我的主要問題:

它是如何的代碼collection = this.collection能夠看到外部收集?

// A wrapper view to display each album in Library 
    window.LibraryView = Backbone.View.extend({   
     tagName: 'section', 
     className: 'library', 

     initialize: function() { 
      _.bindAll(this, 'render'); 
      this.template = _.template($('#library-template').html()); 
      this.collection.bind('reset', this.render); 
     }, 

     render: function() {    
      var $albums, 
       collection = this.collection;   

      $(this.el).html(this.template({})); 
      $albums = this.$('.albums'); 
      collection.each(function(album) { 
       var view = new LibraryAlbumView({ 
        model: album, 
        collection: collection 
       }); 
       $albums.append(view.render().el); 
      }); 
      return this; 
     } 

    }); 

這裏的相冊集:

// Albums Collection 
    window.Albums = Backbone.Collection.extend({ 
     model: Album, 
     url: '/albums' 
    }) 

編輯:


我想我找到了感謝幫助在這裏:

有另一塊創建庫變量並將其分配給新的代碼專輯集合:

window.library = new Albums(); 

此外,在路由器有一個初始化語句通過在「庫」變量:

initialize: function() { 
      this.libraryView = new LibraryView({ 
       collection: window.library 
      }); 

現在它似乎更有意義。 :)

只是發佈這個以防其他人像我一樣困惑。

+1

找到您初始化的地方查看(在路由器?)。你可能會傳入收藏。 – Heikki

+0

就是這樣 - 謝謝! – PhillipKregg

+0

我也在關注Peepcode教程!並有完全相同的問題。我相信混淆來自於視頻中的一次飛躍,其中視圖之前是在Chrome控制檯中構建的,但視頻剪輯和集合是在路由器構造函數中分配的。 –

回答

5

集合必須傳遞給LibraryView構造函數。例如,

myLibrary = new LibraryView({ 
    collection: new Albums() 
}) 

然而,在這裏發生了一個重要的魔術。傳遞給View構造函數的所有內容都在View的options屬性中結束。然而,選擇數量的屬性會被複制到視圖本身。所以你可以說this.collection而不是this.options.collection

這些特殊屬性:

「模型」,「收藏」,「厄爾尼諾」,「身份證」,「屬性」,「類名」,「標籤名」

+0

感謝馬克斯 - 我編輯了我的原始帖子,以顯示出問題的原因,以防別人遇到同樣的問題。 – PhillipKregg