我正在使用backbone.js來實現好友列表aka名冊。我對名冊收集和個人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模型remove函數我得到這個錯誤:
TypeError: this.$el is undefined
this.$el.remove();
我在做什麼錯?從集合中刪除元素時,如何從元素中刪除元素?
你是什麼意思我有每個evenet綁定定義的問題?不知道我真的很明白什麼樣的行爲是對你誠實的。我只是認爲所有事件都必須添加到綁定。 – reach4thelasers 2012-04-16 20:49:30
綁定函數的第三個參數代表什麼? – reach4thelasers 2012-04-16 22:07:03
這工作!謝謝!認爲我已經通過閱讀另一個stackoverflow帖子瞭解bindall是什麼,但爲什麼沒有綁定所有的工作?它似乎做同樣的事情....也爲什麼我不需要在集合綁定語句額外的'這個'? – reach4thelasers 2012-04-17 08:04:16