Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 主干事件处理程序不';行不通_Javascript_Jquery_Backbone.js - Fatal编程技术网

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;
    }
});