0

正如你所看到的,我在骨干方面很新,我不知道为什么这不起作用???

我收到这个错误?

未捕获的类型错误:无法调用未定义的“on”方法

代码

TodoItem = Backbone.Model.extend({});

TodoList = Backbone.Collection.extend({
    model: TodoItem,
    url: "todo"
});

var TodoView = Backbone.View.extend({
    el: '#content',
    initialize: function() {
        this.model.bind('change', this.render, this);
    },
    render: function(model) {
        this.$el.html('test');
    }
});

$(function() {

    var todoList = new TodoList();

    todoList.fetch();

    new TodoView();

});

URL TODO - JSON

[ {description: 'Pick up milk.', status: 'incomplete', id: 1},
{description: '去洗车', status: 'incomplete', id: 2} ]

4

1 回答 1

1

this.model在视图中使用:

initialize: function() {
    this.model.bind('change', this.render, this);
},

但是您在创建视图时没有指定模型:

new TodoView();

这应该看起来更像:

new TodoView({ model: some_model })

如果您想TodoView查看整个集合,请使用this.collection

initialize: function() {
    this.collection.on('change', this.render, this);
}

collection在创建视图时提供选项:

new TodoView({ collection: todoList });

另请注意,这todoList.fetch();是一个 AJAX 调用,因此您在创建视图时可能没有任何内容todoList,您可以绑定到'reset'事件以在出现某些内容时重新渲染:

initialize: function() {
    _.bindAll(this, 'render');
    this.collection.on('change', this.render);
    this.collection.on('reset',  this.render);
}

您也可以使用_.bindAll将函数绑定到this,这样您就不需要使用第三个参数到on

顺便说一句,bind是 的别名onbind仍然有效,但on它是新代码的首选方法;AFAIK,名称已更改为on更好地匹配较新的 jQuery 命名方案。

于 2012-06-10T05:35:49.990 回答