Javascript 主干事件处理程序不';行不通
我有两个视图——一个是顶层布局视图,另一个是新的表单视图,它充当布局的子视图并在其中进行渲染。表单视图中有一个事件处理程序,它应该根据输入的数据创建模型的新实例 以下是布局视图:Javascript 主干事件处理程序不';行不通,javascript,jquery,backbone.js,Javascript,Jquery,Backbone.js,我有两个视图——一个是顶层布局视图,另一个是新的表单视图,它充当布局的子视图并在其中进行渲染。表单视图中有一个事件处理程序,它应该根据输入的数据创建模型的新实例 以下是布局视图: var LayoutView = Backbone.View.extend({ el: "#layout", render: function (view) { this.child = view; if (this.child) { this.c
var LayoutView = Backbone.View.extend({
el: "#layout",
render: function (view) {
this.child = view;
if (this.child) {
this.child.remove();
}
this.$el.html(this.child.render().el);
return this;
}
});
这是我的表单视图:
var ResumeForm = Backbone.View.extend({
events: {
'click #create': 'createResume'
},
initialize: function () {
this.template = _.template($('#new-resume').html());
},
render: function () {
this.$el.html(this.template());
return this;
},
createResume: function () {
// getting values from template inputs and saving them to model
var resume = new Resume({
profession: $('#profession').val(),
firstName: $('#firstname').val(),
lastName: $('#lastname').val()
});
// saving a new model to collection instance
resumes.add(resume);
resume.save(null, {
success: function (res) {
console.log("POST resume id " + res.toJSON().id);
},
error: function () {
console.log("Failed to POST");
}
});
}
});
我的表单视图在布局视图中呈现得非常完美,但是当我输入值并单击#create
按钮时,什么都没有发生——既不保存模型,也不记录我的createResume
方法中的任何错误。我怀疑在布局视图中呈现表单视图时,行this.$el.html(this.child.render().el)代码>只是销毁所有事件侦听器,因为如果我将这些侦听器添加到布局视图中,它就可以工作
有什么方法可以忽略此问题吗?主干的视图删除函数取消对绑定到el
的事件的删除
从:
这与jQuery函数有关(我的重点):
类似于,.remove()
方法将元素从DOM中取出。如果要删除元素本身以及其中的所有内容,请使用.remove()
。除了元素本身,与元素关联的所有绑定事件和jQuery数据都将被删除。要删除元素而不删除数据和事件,请改用
如果在重用视图之前调用remove
,则需要手动调用this.delegateEvents()
从事件中重新绑定事件,并重新连接视图正在侦听的任何事件this.listenTo(…)
但是重新使用视图的最佳方法是,不调用调用调用停止侦听的remove
,您可以使用取消事件委派的setElement
,将视图元素更改为已传递的元素,然后重新委派事件
您的LayoutView
将变成这样:
var LayoutView = Backbone.View.extend({
el: "#layout",
render: function(view) {
// if the view is different, make sure to undelegate the old view.
if (this.child && this.child !== view) this.child.undelegateEvents();
this.child = view;
this.child.setElement(this.$el).render();
return this;
}
});
非常感谢你,埃米尔!这非常有效。我想我应该多看一些文件。现在还有另一个问题——当我点击#create
按钮时,它抛出了以下错误:backbone.js:1907未捕获错误:一个“url”必须指定属性或函数
,但这与此无关question@AlexNikolaev94该错误与您的Resume
型号没有urlRoot
属性有关,或者位于具有url
属性的集合中。它确实存在于具有url
属性的集合中。我应该删除它并将urlRoot
属性添加到模型中吗?@AlexNikolaev94我必须看看,但你可以问另一个问题,我或其他人可能会帮助你。
setElement: function(element) {
this.undelegateEvents();
this._setElement(element);
this.delegateEvents();
return this;
},
var LayoutView = Backbone.View.extend({
el: "#layout",
render: function(view) {
// if the view is different, make sure to undelegate the old view.
if (this.child && this.child !== view) this.child.undelegateEvents();
this.child = view;
this.child.setElement(this.$el).render();
return this;
}
});