我正在使用带有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 });
});
}
});
答案 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});
});