我渲染了一個模型集合,它與一個collectionView關聯,其中當呈現集合中的每個元素都有其自己的「itemview」時,呈現。緩存的視圖失去其事件
當一個集合進行排序並且基於新訂單重新呈現listView時,我一直在爲每個項目創建一個全新的視圖,並且由於我沒有清除與該模型關聯的任何先前的視圖實例,我相信殭屍正在被留下。
所以最初呈現在我的收藏,我會做...
render : function() {
$(this.el).empty();
var content = this.template.tmpl({});
$(this.el).html(content);
sortingView.el ='#sorting-container';
var els = [];
_.each(this.collection.models, function(model){
var view = new TB_BB.RequestItemView({model : model});
els.push(view.render().el);
});
$('#request-list').append(els);
sortingView.render();
return this;
}
所以每當渲染功能被稱爲第二/第三等的時候,我沒有及時清理TB_BB.RequestItemView(因此殭屍)
爲了克服這個問題,我嘗試在集合視圖中添加一些簡單的緩存,以便創建新的itemview而不是創建新的itemview,而不是使用它。我的代碼
initialize : function(){
_.bindAll(this,"render");
this.collection.bind("add", this.render);
this.collection.bind("remove", this.render);
this.template = $("#request-list-template");
this.views = {};
},
events : {
"change #sort" : "changesort",
"click #add-offer" : "addoffer",
"click #alert-button" : "addalert"
},
render : function() {
$(this.el).empty();
outerthis = this;
var content = this.template.tmpl({});
$(this.el).html(content);
sortingView.el ='#sorting-container';
var els = [];
_.each(this.collection.models, function(model){
var view;
if(outerthis.views[model.get('id')]) {
view = outerthis.views[model.get('id')];
} else {
view = new TB_BB.RequestItemView({model : model});
outerthis.views[model.get('id')] = view;
}
});
$('#request-list').append(els);
sortingView.render();
return this;
}
所以這部作品在這麼多的意見是重新使用 - 但我已經注意到的是,如果我使用一個緩存的視圖(如收集已排序和渲染功能找到緩存查看)子項目視圖上的所有事件停止工作?這是爲什麼?
也有人可以提出一個更好的方式來做到這一點?
謝謝 - 你知道他們爲什麼會放鬆他們的事件嗎? – Xrender 2012-03-21 13:31:57
我會說這是因爲他們的元素(RequestItemView.el)從行$(this.el).empty()上的dom中刪除。重新連接事件正是爲了使用delegateEvents方法。 – OlliM 2012-03-21 13:48:15