Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.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
Backbone.js事件处理程序多次触发_Backbone.js_Backbone Events_Backbone Views - Fatal编程技术网

Backbone.js事件处理程序多次触发

Backbone.js事件处理程序多次触发,backbone.js,backbone-events,backbone-views,Backbone.js,Backbone Events,Backbone Views,我有一个名为Form的视图,它可以呈现一个表单来编辑列表,也可以呈现列表本身,具体取决于传递给render的参数。我添加了事件处理程序,以便可以切换显示/编辑模式。为了保持简单,我从下面的代码中删除了这一点,但这只是为视图在上下文中所做的事情提供了一点上下文 我可以将这个表单视图实例化为另一个视图中的子视图,该视图需要呈现表单或列表,我在新视图中已经这样做了,在新视图中它将呈现为表单 当我需要保存时,我调用form:save事件,它在表单视图中触发一个保存表单的例程,我刚刚让它在这里调用cons

我有一个名为Form的视图,它可以呈现一个表单来编辑列表,也可以呈现列表本身,具体取决于传递给render的参数。我添加了事件处理程序,以便可以切换显示/编辑模式。为了保持简单,我从下面的代码中删除了这一点,但这只是为视图在上下文中所做的事情提供了一点上下文

我可以将这个表单视图实例化为另一个视图中的子视图,该视图需要呈现表单或列表,我在新视图中已经这样做了,在新视图中它将呈现为表单

当我需要保存时,我调用form:save事件,它在表单视图中触发一个保存表单的例程,我刚刚让它在这里调用console.log来显示它的工作原理。在我的代码中,我通过$('a#submit')调用form:save。单击绑定,该绑定绑定到ApplicationView插入的导航按钮(但我认为这与本问题无关)

比方说,我离开了新视图,并多次回到它。当我点击save时,该方法运行的次数与我实例化并呈现新表单视图的次数相同

到目前为止:

我尝试过在新视图的表单视图上使用close方法执行unbind()和remove(),但没有成功

我想我可能在范围界定方面有问题,但我不确定

我知道这与我的导航绑定无关

我认为这可能与僵尸观点有关

有没有让它只运行一次的指针

App.Views.New = Support.CompositeView.extend
initialize: (options) ->
    _.bindAll this, 'render'
    @model = new App.Models.Item()

render: ->
    self = this

    form = new App.Views.Form model: @model, collection: @collection

    @$el.append form.render().el

    setTimeout (->
        $('a#submit').click (e) ->
            e.preventDefault()
            App.eventHandler.trigger 'form:save'
    ), 0
    this

App.Views.Form = Support.CompositeView.extend
initialize: ->
    _.bindAll this, 'render', 'save'

    App.eventHandler.on 'form:save', @save

render: ->
    self = this
    # RENDER TEMPLATE HERE
    this

save: ->
    console.log 'form saved'

我认为您的问题是,每次要渲染表单时都会创建一个新视图,但并没有摆脱旧视图。您可以做的是销毁旧视图,或者保留对它的引用,而不是每次都创建新视图,只需将模型传递到现有视图并刷新/重新渲染显示

我相信您的问题在于每次要渲染表单时都要创建一个新视图,但您并没有摆脱旧视图。您可以做的是销毁旧视图,或者保留对它的引用,而不是每次创建新视图,只需将模型传递到现有视图并刷新/重新渲染显示

我认为您遇到了典型的僵尸视图问题,但是我不太明白,在表单被销毁后,新项目的视图会被调用吗?或者在表单范围内?我认为您遇到了一个典型的僵尸视图问题,但是我不太明白在表单被销毁后新项目的视图被调用了什么?或者在表单范围内?好文章:我如何去破坏旧的视图?我尝试创建一个
close
方法,该方法执行
@unbind()
@remove()
操作,并从一个后退按钮调用该方法,该按钮离开新视图并转到其他地方,但当我再次返回新视图时,这个方法仍然会运行多次。如果在没有看到旧视图的情况下销毁旧视图,那么很难判断您的代码有什么问题。您是否尝试过重复使用同一个视图(通过保留对它的引用)而不是每次创建一个新的视图?我已经创建了一个变量将此视图存储在主应用程序对象中,并使用该变量引用其他应用程序对象中的视图。谢谢你的帮助。好文章:我将如何去破坏旧的观点?我尝试创建一个
close
方法,该方法执行
@unbind()
@remove()
操作,并从一个后退按钮调用该方法,该按钮离开新视图并转到其他地方,但当我再次返回新视图时,这个方法仍然会运行多次。如果在没有看到旧视图的情况下销毁旧视图,那么很难判断您的代码有什么问题。您是否尝试过重复使用同一个视图(通过保留对它的引用)而不是每次创建一个新的视图?我已经创建了一个变量将此视图存储在主应用程序对象中,并使用该变量引用其他应用程序对象中的视图。谢谢你的帮助。