backbone.js集合,重写为JSON方法

我有一个模型,它有两个属性,即集合:

MainModel= Backbone.Model.extend({
  defaults: {
     colOne:undefined,
     colTwo:undefined
  },

  initialize:function() {
    this.set({colOne:new InnerCollection()});
    this.set({colTwo:new InnerCollection()});
  }
});

InnerCollection= Backbone.Collection.extend({ 
  model: InnerModel, 
});

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

我发现物品( InnerModels )没有从收藏夹colOne和colTwo中正确删除。 我在Stackoverflow上发现了一个问题,它似乎解释了问题的原因并提出了解决方案。 我在我的模型上提供了toJSON()的重载实现:

MainModel= Backbone.Model.extend({
      defaults: {
         colOne:undefined,
         colTwo:undefined
      }

      initialize:function() {
        this.set({colOne:new InnerCollection()});
        this.set({colTwo:new InnerCollection()});
      },

      toJSON: function() {
        _.extend(this.attributes, {colOne: this.get('colOne').toJSON()});
        _.extend(this.attributes, {colTwo: this.get('colTwo').toJSON()});
        return this.attributes;
      },
    });

问题#1 -我不确定为什么这会解决问题或为什么我这样做。

问题#2 -当我尝试在我的视图中使用colOnecolTwo集合时会导致错误。 堆栈跟踪是:

Uncaught TypeError: Object [object Object],[object Object] has no method 'bind'
Backbone.View.extend.initializeinteractiveviews.js:646
Backbone.Viewbackbone.js:1147
childbackbone.js:1392
Backbone.View.extend.renderinteractiveviews.js:441
Backbone.View.extend.renderinteractiveviews.js:619
(anonymous function)interactiveviews.js:766
_.each._.forEachunderscore.js:76
wrapper.(anonymous function)underscore.js:961
Backbone.View.extend.renderinteractiveviews.js:758
Backbone.View.extend.renderinteractiveviews.js:452
Backbone.View.extend.renderinteractiveviews.js:619
(anonymous function)interactiveviews.js:766
_.each._.forEachunderscore.js:76
wrapper.(anonymous function)underscore.js:961
Backbone.View.extend.renderinteractiveviews.js:758
Backbone.View.extend.renderinteractiveviews.js:443
Backbone.View.extend.renderinteractiveviews.js:619
window.AppView.Backbone.View.extend.renderindex.html:73
window.AppView.Backbone.View.extend.initializeindex.html:47
Backbone.Viewbackbone.js:1147
childbackbone.js:1392
(anonymous function)index.html:97
jQuery.Callbacks.firejquery-1.7.2.js:1075
jQuery.Callbacks.self.fireWithjquery-1.7.2.js:1193
jQuery.extend.readyjquery-1.7.2.js:435
DOMContentLoaded

bind只是我尝试使用colOne集合的第一个地方:

// this.collection is colOne
this.collection.bind('myEvent', this.myEventHandler);

我没有任何语法错误,所以我不确定我的toJSON方法是如何破坏的。

更新

这对Backbone.js来说不是问题。 我遇到的问题是不能从事件中解除。 因此,一旦集合为空时,虽然特定的View不再可见,但是它正在触发事件以添加新项目。 这就是为什么每次我从View事件中删除一个项目时,收集的数量都会增加。


这对Backbone.js来说不是问题。 我遇到的问题是不能从事件中解除。

用Item填充集合的视图不再可见,但仍然绑定到UI事件,该事件触发向集合添加Item。 事件的顺序大约是:

Event XYZ triggers creation of View2
View2 creates Item and adds to Collection.

collection.length现在为1)。

...Item removed from Collection.

collection.length现在为0)。

If Collection empty remove `View2`.
View2 removed.

此时如果再次触发事件XYZ, 则会创建两个View2实例,因此会将2个项目添加到集合中 。 即使从集合中删除某个项目,每当删除第一个项目时,长度也会加1。

简介:如果在代码中的任何位置执行$(myView).remove() ,并且已使用事件/绑定,请检查您是否从事件中解除绑定。

链接地址: http://www.djcxy.com/p/48315.html

上一篇: backbone.js collection with overridden toJSON method

下一篇: remove from collection bind to remove from view