【发布时间】:2013-08-23 04:48:24
【问题描述】:
我是一个骨干新手,我正在尝试开发一个类似 Todo 的应用程序。
我有一个主视图,它是一个列表视图,它有子视图。 - 子视图内容可以双击编辑,当按下回车键时会被保存。 - 非常类似于骨干 github 代码中给出的 todo 示例。
var SubView = Backbone.View.extend({
tagName: "li",
events: {
"dblclick" : "show_edit_view",
"blur .element" : "close_edit_view",
"keypress .element" : "save_edit_view",
"click button.remove" : "remove_question"
},
initialize: function(){
this.render();
this.listenTo(this.model, "change", this.render);
},
render: function(){
this.$el.html(_.template($("#sub_view_template").html(),this.model.toJSON()));
return this;
},
show_edit_view: function() {
this.$el.find("div.view").addClass("no_show");
this.$el.find("input").removeClass("no_show");
},
close_edit_view: function(){
this.$el.find("div.view").removeClass("no_show");
this.$el.find("input").addClass("no_show");
},
save_edit_view: function(e){
if (e.keyCode == 13) {
this.model.save({name: e.currentTarget.value});
this.close_edit_view();
}
}
});
这个模板是
<script id="sub_view_template" type="text/x-template">
<div class="view"><%= name %></div>
<input class="element no_show" value="<%= name %>" type="text" /> <button class="remove">Remove</button>
</script>
这个工作正常,模型在视图中更新,更新发布请求被发送到服务器。
但是,当我更改初始化和 save_edit_view 函数时,只会触发第一个更改事件,而不是更改事件。
initialize: function(){
this.render();
this.listenTo(this.model, "change", this.render);
this.input = this.$("input.element");
},
save_edit_view: function(e){
if (e.keyCode == 13) {
this.model.save({name: $(this.input).val()});
this.close_edit_view();
}
}
我想知道问题可能是什么?
感谢您的帮助!!!
【问题讨论】:
-
你给
render打了多少次电话? -
不要在
.initialize()方法中调用.render()函数。 render 应该在视图之外调用,仅仅在视图上实例化并不意味着渲染。 -
@alexanderb 因为子视图没有分配给任何现有元素 - 我认为在初始化函数中调用渲染会更好。 - 我想,我可以避免为它写一个对象。那是我的意图。但是,对于那些绑定到 dom 中现有元素的视图,我总是单独调用 render。
-
@muistooshort 好吧,子视图渲染只在初始化函数中调用。
-
对,
el的内容通常会在render内部发生变化,因此任何引用el内容的内容也应该在render内部进行。或者根本不用缓存引用,如果您使用this.$()正确本地化您的搜索,这几乎不值得麻烦。
标签: backbone.js backbone-events