2011-07-09 12 views
3

私はブランチをバックボーンで使用するためにevent.preventdefault()に問題があります。最初は動作しますが、ページを変更した後は動作しなくなります。event.preventdefault()は2回目のレンダリング後に動作しません

私は、テンプレートにパラメータを渡し、ページがレンダリングされることに応じてビューを持っています。このページには複数のフォームがあり、パラメータに応じて1つを読み込みます。すべてのフォームは、送信ボタンにバインドされたデフォルトを回避していますが、何らかの理由で、ナビゲーションリンクの1つを使用してフォームを切り替えると、preventdefaultが機能しなくなり、フォームがポストされます。なぜこれが当てはまるのでしょうか?コードを見る必要があるかどうかを教えてください。

この例の例: [記事を送信]ナビゲーションリンクをクリックして何かを入力し、[submit]を押します。私は警告を受け取り、何も起こらない。今度は「詩を提出」をクリックして提出をクリックしますが、今回はフォームが投稿されます。私が「詩を提出する」と始まったら、うまくいきます。送信する前に 'submit poem'をクリックしてリフレッシュしても動作します。奇妙な....

編集:追加コードサンプル。テンプレートは、渡された型に従ってレンダリングされます。

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 

答えて

1

追加のフォームと送信ボタンは後でどのように読み込みますか?もしあなたがそれらを動的に引っ張っているなら、あなたのイベントはもはや添付されないかもしれません。 jqueryのライブメソッドを使用して、フォームをフォーム送信にバインドできます。

.live()

+0

動作していないようです。これは、viewコンストラクタがビューがロードされるたびにこれを呼び出すため、問題ではありません。 – userinev

+0

私は最初にあなたの質問を間違って読んでいたはずです。答えを、あなたが説明しているものにもっとインラインである可能な解決策で更新しました。それでも問題が解決しない場合は、コードのスニペットをいくつか入れて、物事のセットアップ方法や進行状況を少し洞察してください。 – ryanmarc

+0

甘い!ライブで問題を解決しました。ダイナミックな挿入/置換が原因だと思います。バックボーンをどのように自動的に行うのかわからない... – userinev

1

私は同じ問題を抱えていました。

回避策
はBackbone.ViewがDOMに追加された後、手動delegateEvents()を呼び出すことです。

問題
私は(jQuery.removeを経由して)すべてのDOMイベントリスナーを削除したsubview.remove()を呼び出して、後でその同じサブビューのインスタンスを使用しました。

ソリューション ビューがアクティブのままにしているが、他の状況で一時的に非表示の使用でなければならないthis.$el.hide() & this.$el.show()

場合はBackbone.Viewインスタンスを再利用しますが、newものをインスタンス化しません。

関連する問題