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

时间:2012-07-23 14:51:56

标签: backbone.js backbone-events backbone-views

我有一个名为Form的视图,它可以呈现编辑列表的表单,也可以呈现列表本身,具体取决于传递给渲染的参数。我添加了事件处理程序,以便可以切换显示/编辑模式。我已经从下面的代码中解决了这个问题,以保持简单,但这只是给出了View在上下文中所做的一些上下文。

我可以将这个窗体视图实例化为另一个视图中的子视图,该视图需要一个表单或要呈现的列表,我在新视图中完成了它,它将作为一个表单呈现。

当我需要保存时,我调用表单:save event,它在Form视图中触发一个保存表单的例程,我刚刚在这里调用了console.log来显示它的工作原理。在我的代码中,我调用表单:通过$('a#submit')保存。单击绑定绑定到由ApplicationView插入的导航按钮(但我不认为这对于此问题的目的很重要。)

让我们说我远离新视图,我会多次回到它。当我点击保存时,该方法运行我实例化的次数并呈现一个新的窗体视图。

到目前为止:

我尝试在New视图的Form视图中的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'

1 个答案:

答案 0 :(得分:3)

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