我有一个backbone页面,其行为如下。
Collection - > Models -> Views
我有一个包含N个搜索结果的集合。每个模型都与一个视图实例相关联,这个视图在本例中是显示的数据行。
我希望能够从“详细信息”视图切换到“高级”视图,后者包含更多信息。目前,父视图为每个模型呈现了N个视图。我可以通过更新模型并监听更改事件来切换状态,然后仅重新渲染我点击的视图的部分。但是我注意到了一个问题。问题是视口跳转到页面的顶部,这不是很好的用户体验。
在调试时,我注意到了一些奇怪的东西
父视图(包含搜索结果的页面)的渲染函数被调用,这反过来又调用了每个行的渲染函数。我认为这就是导致每个子视图重新渲染的原因。
以下是一些代码示例,以演示问题:
// The child view's render and initialis
var SearchInviteRow = Backbone.View.extend({
tagName: "invite-section-result-row",
initialize: function(params){
this.template = templateHTML;
this.extendedTemplate = extendedTemplate;
this.listenTo(this.model, 'change', this.render);
},
events : {
"click .toggle-attachments" : "renderWithAttachments"
},
render: function(){
var view = this, render;
var that = this;
if(!this.model.get("expand")){
var rendered = Mustache.render(view.template, that.model.toJSON());
this.$el.html(rendered);
} else {
var rendered = Mustache.render(view.extendedTemplate, that.model.toJSON());
this.$el.html(rendered);
}
return this;
},
close: function(){
this.remove();
},
renderWithAttachments: function(){
if( !this.model.get("expand") ) {
this.model.set( {"expand" : true } );
this.model.getAttachments();
} else {
this.model.set( {"expand" : false } );
}
}
});
这是父元素渲染的一部分,用于迭代集合并将行追加到搜索磁贴中。
for (var i = 0; i < this.collection.length; i++) {
view.subViewArray[i] = new SearchInviteRow({
model: this.collection.at(i)
});
this.$(".invite-section-inside").append(view.subViewArray[i].render().el);
}
我无法理解的是为什么父组件的渲染函数会被调用,这导致了其他问题。