我使用像这样的“change:status”事件制作并初始化了我的模型
Box = Backbone.Model.extend({
initialize: function() {
this.on('change:status', this.changed, this);
},
changed: function() {
$('.changed').text('I changed'); // Testing if the 'change:status' is fired
}
});
My Box系列以这种方式设置
BoxList = Backbone.Collection.extend({
model: Box,
initialize: function() {
this.on('add', this.addOne, this);
socket.on('box-status-change', this.boxStatusChanged, this);
},
boxStatusChanged: function(box) {
Boxes.each(function(model) {
if(model.get('changed') == box.changed) {
model.set({status: 'changed'});
}
});
},
addOne: function.... // Some code removed
});
Boxes = new BoxList();
签入Chromes Web开发人员工具时,属性status
已正确设置为changed
,但发生了错误Uncaught TypeError: Object #<Object> has no method 'apply'
。模型的change:title
事件未被触发。将事件添加到模型中时,我会错过什么?
顺便说一句,我正在使用 backbone-iosync.js 作为Backbone.sync
方法......
答案 0 :(得分:4)
Backbone在模型上使用名为changed的内部属性:
http://backbonejs.org/#Model-changed
已更改 model.changed
changed属性是包含所有内部哈希的内部哈希 自上次“更改”事件以来已更改的属性 触发。请不要直接更新。它的状态是 通过设置和更改在内部维护。改变的副本可以 从changedAttributes获得。
将您的回调重命名为其他内容并且可以正常运行
Box = Backbone.Model.extend({
initialize: function() {
this.on('change:status', this.changedState, this);
},
changedState: function() {
console.log('changed');
}
});
重现问题的小提琴http://jsfiddle.net/NrTPk/和修改后的版本http://jsfiddle.net/NrTPk/1/