0

コレクションである 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 イベントから項目を削除するたびにコレクションの数が増えた理由です。

4

1 に答える 1

0

これはBackbone.jsの問題ではありませんでした。私が経験した問題は、イベントから解放されないことでした。

コレクションにアイテムを追加したビューは表示されなくなりましたが、コレクションへのアイテムの追加をトリガーするUIイベントにバインドされていました。イベントのシーケンスはおおよそ次のとおりです。

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が再度トリガーされると、2つのView2インスタンスが作成されるため、2つのアイテムがコレクションに追加されます。コレクションからアイテムが削除された場合でも、最初のアイテムが削除されるたびに長さが1ずつ増加します。

概要:$(myView).remove()コードのどこかで実行し、イベント/バインディングを使用したことがある場合は、イベントからバインドを解除することを確認してください。

于 2012-04-14T21:51:32.210 に答える