2012-06-12 72 views
1

我目前正在通過截屏視頻教程學習backbone.js,我的代碼似乎停止工作,在Chrome的JavaScript控制檯中拋出錯誤Cannot call method 'bind' of undefined。錯誤路線包含在initialize功能:backbonejs:無法調用未定義的方法'綁定'

window.PlaylistView = Backbone.View.extend({ 
    tag: 'section', 
    className: 'playlist', 

    initialize: function() { 
     _.bindAll(this, 'render'); 
     this.template = _.template($('#playlist-template').html()); 
     this.collection.bind('reset', this.render); //<<<<<< THIS LINE 

     this.player = this.options.player; 
     this.library = this.options.library; 
    }, 

    render: function() { 
     $(this.el).html(this.template(this.player.toJSON())); 

     this.$('button.play').toggle(this.player.isStopped()); 
     this.$('button.pause').toggle(this.player.isPlaying()); 

     return this; 
    } 
}); 

我不知道是什麼this.collection手段,爲什麼認爲有一個集合,是不是模型收藏?其他意見中使用的this.collection.bind()似乎沒有引發任何錯誤。在window.LibraryAlbumView中調用this.collection.trigger('select', this.model);並延伸window.AlbumView,我沒有看到在window.AlbumView中任何地方定義的任何集合,但沒有發生錯誤。這似乎讓我感到困惑。

JSFIDDLE

編輯:

的錯誤已得到修復,因爲不是

window.Player = Backbone.Model.extend({ 
     defaults: { 
      'currentAlbumIndex': 0, 
      'currentTrackIndex': 0, 
      'state': 'stop' 
     }, 

     initialize: function() { 
      this.playlist = new Playlist(); 
     }, 

window.Player = Backbone.Model.extend({ 
     defaults: { 
      'currentAlbumIndex': 0, 
      'currentTrackIndex': 0, 
      'state': 'stop' 
     }, 

     initialize: function() { 
      playlist = new Playlist(); // <<< this line changed! 
     }, 

以前也this.collection refered到這裏彙集,

window.BackboneTunes = Backbone.Router.extend({ 
    routes: { 
     '': 'home', 
     'blank': 'blank' 
    }, 

    initialize: function() { 
     this.playlistView = new PlaylistView({ 
      collection: window.player.playlist, // <<<< THIS ONE! 
      player: window.player, 
      library: window.library 
     }); 

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

回答

3

骨幹視圖中有一集或模型,因爲意見都是爲了呈現包含在模型或模型的一個集合中的數據。

此示例將引發錯誤,因爲尚未定義this.collection。要做到這一點,你需要初始化一些集合,然後將它傳遞給你的視圖。

new PlayListView({collection: someCollection});

+0

謝謝,我跟着你的反應和解決的錯誤在原來的職位更新。 'this.playlist = new Playlist();''this.playlist''和'playlist'有什麼區別?是'playlist'全球性的,如果它的全球性,爲什麼這會導致錯誤,因爲每個對象將能夠訪問''這個'播放列表' – Nyxynyx

+0

通常從來沒有你期望的那樣。這就是爲什麼你應該在所有視圖和集合初始化方法中使用underscore.js'_.bindAll(this,'methodname','methodname2',...)'方法將其綁定到集合或視圖的方法。使用'this.playlist'你聲明播放列表是'window.player'的一部分,所以可以通過'window.player.playlist'來訪問。 – jakee

+0

好了,我現在明白了,謝謝! – Nyxynyx

相關問題