无法让Backbone Events工作

时间:2014-03-01 13:50:50

标签: backbone.js backbone-events

我正在使用带有jQuery 1.11的Backbone.js 1.1.2。

我想我错过了很简单的事情。

我已经设置了一个模型:Contact和一个集合:ContactList

我成功使用从ContactView

获得的模型呈现ContactList.fetch()次观看

但是当我尝试在视图初始化程序中绑定更改事件时:

this.model.on('change', this.render, this);

......我明白了:

backbone Uncaught TypeError: Object #<Object> has no method 'on'

所以我回到文档并阅读.on()Backbone.Events的一部分,不知怎的我需要扩展我的模型才能使用它(为什么这个不是模型的开箱即用功能的一部分??)

我试过宣布

_.extend(this, Backbone.Events); 

...在声明绑定之前ContactView的初始化函数内部,但没有骰子。

我需要做些什么来使Backbone.Events功能正常工作?

更新:所有相关代码(无模板)

var Contact = Backbone.Model.extend({
    defaults: {
        FirstName: '',
        ...[etc]
    },
    initialize: function() {
    }
});

var ContactList = Backbone.Collection.extend({
    model: Contact,
    url: '/api/Contacts/getall'
});

var ContactView = Backbone.View.extend({        
    initialize: function() {
        this.render();
        this.model.on('change', this.render, this);
    },
    render: function () {
        var template = _.template($('#contact_template').html(), this.model);
        this.$el.html(template);
    }
});

var contactList = new ContactList();

contactList.fetch({
    success: function (collection, response, options) {
        contactList.models.forEach(function (m) {
            var $el = $('<li />')
                .addClass('adminItem clearfix')
                .appendTo($('#contactList'));
            new ContactView({ el: $el, model: m.attributes });
        });
    }        
});

1 个答案:

答案 0 :(得分:2)

此行是麻烦的来源

new ContactView({ el: $el, model: m.attributes });

m.attributes is a plain js object。您想传递实际的模型对象:

new ContactView({ el: $el, model: m});

因为the collection has underscore methods mixed in你应该能够简化它:

    contactList.each(function (m) {
        var $el = $('<li />')
            .addClass('adminItem clearfix')
            .appendTo($('#contactList'));
        new ContactView({ el: $el, model: m});
    });