私はbackbone.jsを使ってRosterというバディリストを実装しています。次のように名簿の収集および個々のrosterEntry
のための私のバックボーンビューは、次のとおりです。Backbone.js:コレクションからアイテムを削除する
Slx.Roster.Views.RosterEntry = Backbone.View.extend({
tagName: "li",
className : "rosterEntry clearfix",
templateSelector: '#rosterEntryTemplate',
initialize: function() {
_.bindAll(this, 'render');
this.model.bind('change', this.render);
this.model.bind('remove', this.remove);
this.template = _.template($("#rosterEntryTemplate").html());
},
remove: function() {
debug.log("Called remove event on model");
$(this.el).remove();
},
render: function() {
var renderedContent = this.template(this.model.toJSON());
this.id = this.model.Id;
$(this.el).attr('id', "friendid-" + this.model.get("id")).html(renderedContent);
return this;
}
});
Slx.Roster.Views.Roster = Backbone.View.extend({
el: "div#roster-container",
initialize: function() {
_.bindAll(this, 'render', 'add', 'remove');
this.template = _.template($("#rosterTemplate").html());
this.collection.bind('reset', this.render);
this.collection.bind('add', this.add);
this.collection.bind('remove', this.remove);
},
add: function (rosterEntry) {
var view = new Slx.Roster.Views.RosterEntry(
{
model: rosterEntry
});
$(this.el).append(view.render().el);
},
remove: function (model) { // if I ommit this then the whole collection is removed!!
debug.log("called remomve on collection");
},
render: function() {
var $rosterEntries, collection = this.collection;
$(this.el).html(this.template({}));
$rosterEntries = this.$('#friend-list');
_.each(collection.models, function (model) {
var rosterEntryView = new Slx.Roster.Views.RosterEntry({
model: model,
collection: collection
});
$(this.el).find("ul#friend-list").append(rosterEntryView.render().el);
}, this);
return this;
}
})
私は今、Firebugのコンソールを使用するためのテストだし、次のことを実行することでうまく名簿を移入することができます
collection = new Slx.Roster.Collection
view = new Slx.Roster.Views.Roster({collection:collection})
collection.fetch()
コレクションに追加すると、Firebugのコンソールで次のコマンドを実行して、正常に動作します:
collection.add(new Slx.Roster.Model({username:"mickeymouse"})
と新しいrosterEntry
が追加されました。
私の問題は、collection.remove(5)
はメモリ内のコレクションから削除しますが、DOMを更新することは何もしません。
奇妙なことに、私がremove()
機能をロスタービューから除外すると、ロスターのすべてのエントリが削除されます。このメソッドに何も入れずにコンソールログを追加すると、RosterとRosterEntry
ビューのremoveメソッドが呼び出されますが、理由はわかりませんが、順序が間違っています。
["Called remove event on model"]
["called remomve on collection"]
私はRosterEntryモデルから削除機能を削除した場合、私はこのエラーを取得する:
TypeError: this.$el is undefined
this.$el.remove();
は私が間違って何をしているのですか?コレクションから削除されたDOMから要素を削除するにはどうすればよいですか?
すべてのEvenetバインド定義に問題があるとはどういう意味ですか?私は本当にあなたに正直であるためにbindallが何であるかを理解していません。私はちょうどすべての出来事がbindallに加えられなければならないと思った。 – reach4thelasers
バインド関数の3番目のパラメータは何を表していますか? – reach4thelasers
これがうまくいった!ありがとう!私は別のstackoverflowのポストを読むことによってbindallが何のためにsussedだと思うが、なぜbindallの仕事をしなかったのですか?それは同じことをするように思われる....なぜ私はコレクションのバインドステートメントに余分な 'this'を必要としないのですか? – reach4thelasers