2015-01-19 12 views
0

У меня есть ячейки с различными валидаторами на них. Когда одна ячейка проверяется, мне нужно повторно проверить другие ячейки ее группы. Validation пожары на «размытых» событиях, так что я должен вызвать «размывания» событие на все клетки в группе:Как подождать все обратные вызовы в каждом цикле

element.attr('validated', true); 
var validityGroup = getValidityGroupElements(); 
validityGroup.each(function() { 
    $(this).blur(); 
}); 
element.attr('validated', false); 

Здесь element является текущей ячейкой и функция getValidityGroupElements() дает мне массив элементов текущей группы ти validated="false" атрибута , Я устанавливаю этот атрибут, чтобы избежать бесконечного цикла, когда каждая ячейка будет проверять все ячейки в своей группе и так далее. Но проблема заключается в следующем: как подождать все обратные вызовы, которые выполняются в цикле .each, и только после этого установить проверенный атрибут текущего элемента на false?

+1

Вы можете просто вызвать 'validityGroup.blur()', не нужно для цикла, а 'validated' не является допустимым атрибутом, используйте' data-validated' или '.validated' css class –

+0

Вам не нужно ждать, пока каждый из них будет выполнен - ​​повторяется здесь http://stackoverflow.com/a/7371983/1270199 – Aman

+0

@Aman 'each' является синхронным, но' element.attr ('validated', false) 'выполняет перед' blur' callbacks firees, thats the problem :( – mopdobopot

ответ

1

Вы злоупотребляете событием blur, чтобы вызвать проверку, которая вызывает проблемы: в вашем браузере «отправить событие blur» является синхронным (так что событие отправляется сразу), но обработчик не выполняется при этом время. Браузер просто подталкивает событие в стек и затем начинает их выполнять. Поскольку JS не поддерживает параллельное выполнение, первое событие blur будет выполнено после кода выше - то есть после того, как validated будет сброшен на false.

Гораздо лучше дизайн будет прикрепить функцию проверки к элементу:

e.data('validate', function(){...}); 

В blur() и везде, теперь вы можете написать: e.data('validate')(); вызвать функцию проверки (двойные круглые скобки не typo - e.data('validate') возвращает функцию).

Это позволит вам проверять в четко определенном порядке и синхронно без каких-либо событий или с помощью взлома validated.

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

  • Нет связанных вопросов^_^