在Collections.each </object>中设置模型属性时,Backbonejs,“对象#<对象>没有方法应用”

时间:2012-08-21 09:19:01

标签: node.js backbone.js

我使用像这样的“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方法......

1 个答案:

答案 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/