学习Backbone.js - 无法将'this.model'转换为对象

时间:2013-05-25 23:25:30

标签: javascript backbone.js underscore.js

我是新手,试图学习Backbone.js,我有这个错误:

  

无法将'this.model'转换为对象

我正在尝试为audioplayer构建一个简单的架构,但这个错误让我很生气!不明白为什么会发生这种情况,但浏览器控制台会在ListOfSongsView的this.model.bind(“reset”,this.render,this)中显示错误。

这是我的代码:

$(function () {    
    var Player = Backbone.Model.extend({
        defaults:{
             //blablabla
        }
    });     
    var Playlist = Backbone.Collection.extend({ 
        model: Player
    });    
    var MyPlaylist = new Playlist([ 
        { 
            //blablabla
        }
//here comes more songs
    ]);     
    var ListOfSongsView = Backbone.View.extend({                    
        tagName: 'ul',
        id: "tracks",        
        initialize: function () {
            this.model.bind("reset", this.render, this);
            var self = this;
            this.model.bind("add", function (player) {
                $(self.el).append(new OneSongView({model:player}).render().el);
            });
        },       
        render: function (eventName) {
            _.each(this.model.models, function (player) {
                $(this.el).append(new OneSongView({model:player}).render().el);
            }, this);
            return this;
        }
    });      
    var OneSongView = Backbone.View.extend({     
        tagName: "li",
        calssName: "clearfix",   
        template:_.template($('#tpl-one-song').html()),      
        initialize: function () {
            this.model.bind("change", this.render, this);
        },       
        render: function (eventName) {
            $(this.el).html(this.template(this.model.toJSON()));
            return this;
        }        
    });     
    var AppRouter = Backbone.Router.extend({    
        routes:{
            "": "list",
            "!/": "list"
        },      
        initialize: function () {
            $('#block').html(new ListOfSongsView().render().el);
        },          
        list: function () {
            this.playlist = new Playlist();
            this.ListOfSongsView = new ListOfSongsView({model:this.playlist});
            this.playlist = MyPlaylist;
            $('#block').html(new ListOfSongsView().render().el);
        }           
    });      
    var app = new AppRouter();
    Backbone.history.start();    
});

我做错了什么? 求你帮我,我的头已经破了:(

1 个答案:

答案 0 :(得分:0)

initialize: function () {
        $('#block').html(new ListOfSongsView().render().el);
    }

这就是构建AppRouter的那一刻。 你没有在ListOfSongsView()的参数中传递任何模型,所以this.model是未定义的。

然后调用视图的初始化:

 initialize: function () {
        this.model.bind("reset", this.render, this);
        var self = this;
        this.model.bind("add", function (player) {
            $(self.el).append(new OneSongView({model:player}).render().el);
        });
    },

this.model未定义,因此您无法在其上调用bind。