2016-07-16 4 views
0

Я пытаюсь обойти старую систему и по существу захватить кнопку отправки при некотором условии, применить обработчик к ней, а затем отвязать этот обработчик, когда закончите. Я использую bind и unbind, но событие связывается кумулятивно каждый раз, когда я запускаю форму, о которой идет речь.Отключить события от обработчика 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() первых и пространство имен вашего события. Удаление пространства имён событие не будет мешать другим слушателям же события

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

Обратите внимание, что bind() и unbind() устаревшими .. использовать on() и off(0 вместо этого.

Лучше было бы делегировать это один раз при загрузке страницы, а не продолжать называть один и тот же класс

+0

Я специально нужно 'off' называться только для обработчика я определила' (this.submit) '. Я работаю над плохим кодом в проекте с учетом времени, и это единственное решение, о котором я могу думать. Я знаю, что это может работать, я просто не знаю, почему мой метод не работает. – BarryBones41

+0

Вы также можете использовать события пространства имен ... но лучше всего делегировать это один раз только при загрузке страницы. – charlietfl

+0

Попробуйте 'this. $ Submit.off ('click.special'). On ('click.special', this.submit.bind (this)); ' – charlietfl

Смежные вопросы