コレクションである 2 つのプロパティを持つモデルがあります。
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 -colOne
コレクションまたはcolTwo
ビューで使用しようとすると、エラーが発生します。スタック トレースは次のとおりです。
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 イベントから項目を削除するたびにコレクションの数が増えた理由です。