2013-02-19 2 views
1

У меня есть метод редактирования, который вызывается при нажатии строки, для настройки информации для редактирования (вызов фокуса, выбор вызова для легкого ввода) ... все работает нормально без вызова к следующему редактированию (когда человек достигает последнего элемента в строке, я просматриваю наблюдаемый массив для следующего элемента ... если он есть, он перемещается к следующему элементу, снова вызывая тот же метод).Метод называется несколько раз, а не один раз

Проблема заключается в том, что при вызове этого метода он складывает запросы в памяти и каждый последовательный вызов в действие. Я знаю, что по методам jquery вы можете вызвать метод unbind, чтобы освободить прежние вызовы к тому же методу, не уверенный, какая лучшая методология для этого для рекурсивной функции нокаута будет.

Любые предложения?

Вот скрипка: Example

Вызов на линии 51,

self.editItem(self.items()[index + 1]); 

рекурсивный вызов, который вызывает editItem к следующему пункту в списке ... есть предупреждение на линии 26 который вызывается при запуске метода editItem, показывающего разницу в прогонах. Если вы нажмете на строку и нажмете на любые другие строки, она отлично работает, правильно выбирает и т. Д., Но если вы введете вкладку, когда находитесь в конечном поле справа (когда он выбирает следующий доступный элемент) он начинает складываться.

+0

Пожалуйста, приведите пример ваших привязок/называемых методами или выдачи воспроизведенных на jsfiddle. Трудно помочь, не глядя на код. –

+0

Я работаю над этим, возьму некоторую абстракцию некоторого кода, чтобы закодировать его в jsfiddle, полагая, что я опубликую, чтобы увидеть, имел ли кто-нибудь подобную проблему ранее. –

+0

Добавлена ​​скрипка, чтобы показать проблему на более упрощенном примере, вы можете очень хорошо удалить строки 28-37, а также сделать его более чистым. –

ответ

2

Вы не должны использовать метод делегирования .live здесь, потому что каждый раз, когда в стек предыдущих обратных вызовов добавляется editItem, вызываемый новый обратный вызов keydown.

Так что только две вещи, которые должны быть изменены:

// change .live('keydown', ...) to .keydown(...) or .bind('keydown', ...) 
$('#itemDescriptionEdit').keydown(function (e) { 

    // ... 

    // and return false at the end of callback to stop event propagation 
    return false; 
}); 

Обновлено скрипку: http://jsfiddle.net/ostgals/GmZjF/4/

+0

Удивительно, спасибо, очень хорошо. –

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