2016-07-16 7 views
0

私は古いシステムを回避し、何らかの条件でサブミットボタンをハイジャックし、ハンドラを適用してから、このハンドラをアンバインドします。私はbindunbindを使用していますが、問題のフォームを起動するたびにイベントが累積的にバインドされています。jQueryハンドラからのイベントのバインド解除

class MyForm(){ 
    constructor(){ 
     // button in question 
     this.$submit = $('#submit'); 

     this.$submit.bind('click', this.submit.bind(this)); 
     return this; 
    } 

    submit(){ 
     return this.doAjaxStuff(); 
    } 

    doAjaxStuff(){ 
     var self = this; 
     return $.post(file, data).always(function(){ 
       self.$submit.unbind('click', self.submit); 
     }); 
    } 
} 

残念ながら私は新しいMyFormイベントを作成するたびに、再び結合したが、非結合決してれます。

答えて

1

シンプルな修正は、最初にoff()を使用してイベントを名前空間にします。名前空間イベントを削除すると... bind()unbind()が廃止されたのと同じイベントの他のリスナー

this.$submit.off('click.special').on('click.special', this.submit.bind(this)); 

注意を妨げる代わりにon()off(0を使用しません。

より良いアプローチは、私が特に `唯一の私は、` `(this.submit)を定義したハンドラのために呼び出されることにoff`が必要

+0

同じクラスを呼び出しておく。この度、ページの読み込みではなく、デリゲートになります。私は時間の影響を受けやすいプロジェクトで悪いコードを扱っています。これが私が考えることができる唯一の解決策です。私はそれが働くことができることを知っている、私はちょうど私の方法が動作していない理由を知らない。 – BarryBones41

+0

また、名前空間イベントも可能ですが、これはページロード時にのみ一度だけ委譲されます – charlietfl

+0

これを試してみてください$ submit.off( 'click.special')。on( 'click.special'、this.submit.bind (this)); ' – charlietfl

関連する問題