2012-12-19 80 views
11

我正在使用backbone.js编写一个示例应用程序。连接到el的孩子主干渲染查看更新模型

在我的模型的更新我重新渲染这种方式

$('.target').html(""); 
$('.target').append(this.$el.html(this.template(model))) 

我认为一旦视图模型更新[上改变事件]后重新渲染,事件得到失去[似乎不像jQuery直播]。这是一个已知的问题,还是我错过了什么?我应该尝试替换HTML而不是appendfiddle

+0

你可能想修复你的小提琴,使其运行。例如。使用jQuery并包括Underscore和Backbone以及 –

+1

您不需要两条语句。只需使用一个:'$('。target')。html(this。$ el.html(this.template(model)))',这相当于清除HTML并添加一个新的 – Matanya

+0

@Mike Fielden然后我可能需要把我的整个应用程序:DI认为该观点就足以理解我的问题 – Tamil

回答

10

一旦视图在DOM中,您不需要继续删除并追加它。我认为管理这个最简单的方法是从视图中删除DOM插入,并让view.render的调用者来处理它。

查看:

render: function() { 
    this.$el.html(this.template(model)); 
    return this; 
} 

来电(在第一次渲染):

var view = new SomeView(); 
$('.target').append(view.render().el); 

在随后的呈现:视图已经被渲染成DOM

view.render(); 

后,它可以愉快地保持重新呈现自己而不必了解父视图。事件绑定也应该在渲染之间保持完好。

+0

但append会添加相同的内容两次,或者多次不断更新我的模型“附加”而不是替换? – Tamil

+1

@Tamil的要点是,当你想要首次显示视图时,你只需要追加一次。之后,在视图上调用'render'就足够了,因为'view。$ el'已经在DOM中了。为了清晰起见,我更新了答案。但是,是的,'$ .replaceWith'或其他任何方式都会有相同的结果。 – jevakallio

+0

@fenciff我不知道这:)它的工作真的很好:) – Tamil