event.preventdefault()在第二次渲染后无法正常工作

时间:2011-07-09 01:02:52

标签: backbone.js

我正在使用早午餐来处理骨干,我遇到了event.preventdefault()的问题。它最初工作,但在页面更改后它停止工作。

我有一个视图,它将一个参数传递给模板,并根据该页面进行渲染。此页面有多个表单,并根据参数加载一个。所有表单都有防止默认绑定到提交按钮,但由于某种原因,在我使用其中一个导航链接切换表单后,preventdefault停止工作并且表单被发布。知道为什么会这样吗?如果您需要查看代码,请告诉我。

如何发生这种情况的一个例子: 我点击“提交故事”导航链接并输入内容并点击提交。我得到了js警报,没有任何反应。现在我点击“提交诗歌”并点击提交,但这次表格会被发布。如果我开始使用'提交诗',它就可以了。如果我点击“提交诗歌”并在提交前点击刷新,它也有效。奇怪的...

编辑:添加了代码示例。模板根据传入的类型进行渲染。

class exports.ClientsSettingsView extends UberView
  id: 'settings_view'
  className: 'view_container'

  events:
    'submit #credit_card_form' : 'addCard'
    'submit #profile_pic_form' : 'processPicUpload'
    'submit #edit_info_form' : 'test'
    'click #delete_card' : 'deleteCard'


  render: (type="info",status=0) ->
    $('.spinner#submit').hide()
    @ReadUserInfo()
    $(@el).html clientsSettingsTemplate {type,status}
    @FadeIn()

    @

  addCard: (e) ->
    e.preventDefault()
    $el = $(e.currentTarget)  


    attrs = 
      card_number: $el.find('#card_number').val()
      card_code: $el.find('#card_code').val()
      card_expiration_month: $el.find('#card_expiration_month').val()
      card_expiration_year: $el.find('#card_expiration_year').val()


    options = 
      success: (response) ->
        alert "Added"      
      error: (e) ->
        alert "Error"

    model = new app.models.paymentprofile

    model.save attrs, options
    console.log attrs

2 个答案:

答案 0 :(得分:1)

稍后如何加载其他表单并提交按钮?如果您动态地将它们拉入,则可能不再附加您的活动。您可以尝试使用jquery的实时方法将事件绑定到表单提交。

.live()

答案 1 :(得分:1)

我遇到了同样的问题。

解决方法
将Backbone.View添加到DOM后,手动调用delegateEvents()

问题
我正在调用subview.remove()删除所有DOM事件侦听器(通过jQuery.remove)并稍后使用相同的子视图实例。

解决方案 如果视图必须保持活动但必须暂时隐藏,请使用this.$el.hide()& this.$el.show()

在其他情况下,不要重用Backbone.View实例,而是实例化new个实例。