2011-11-29 76 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