2013-04-03 2 views
2

Я фильтрую таблицу с помощью jQuery, и все хорошо. Этот код прекрасно работает:Дождитесь завершения всех функций async в jQuery

$("*[id$='EquipmentTypeDropDownList']").change(filterTable); 
$("*[id$='StateDropDownList']").change(filterTable); 

function filterTable() { 
    var $equipmentDropDown = $("*[id$='EquipmentTypeDropDownList']"); 
    var $stateDropDown = $("*[id$='StateDropDownList']"); 

    var equipmentFilter = $equipmentDropDown.val(); 
    var stateFilter = $stateDropDown.val(); 

    $("tr.dataRow").each(function() { 
    var show = true; 

    var equimpent = $(this).find("td.equipment").text(); 
    var state = $(this).find("td.readyState").text(); 

    if (equipmentFilter != "Any" && equipmentFilter != equimpent) show = false; 
    if (stateFilter != "Any" && stateFilter != state) show = false; 

    if (show) { 
     $(this).fadeIn(); 
    } else { 
     $(this).fadeOut(); 
    } 
    }); 

    $("table").promise().done(colorGridRows); 
} 

function colorGridRows() { 
    //for table row 
    $("tr:visible:even").css("background-color", "#DED7D1"); 
    $("tr:visible:odd").css("background-color", "#EEEAE7"); 
} 

colorGridRows функция меняет цвет фона четных/нечетных строк для удобства чтения Теперь, было бы хорошо, если я могу заменить показать/скрыть звонки с FadeIn/Затухание, но я не потому, что окраска может (он работает до того, как эффект пользовательского интерфейса завершен.Если это был только один параметр функции - я бы просто создал функцию для завершения и делал с ней. Но в моей таблице много строк и циклов, проходящих через каждый. ВСЕ, чтобы скомпилировать?

EDITED: образец кода обновлен, показывая, как я пытаюсь использовать promise(), но он не работает. Он срабатывает, но я не получаю нечетную/четкую окраску.

+0

Почему бы не просто добавить счетчик в строки 'show' и addClass в одно и то же время? Будет означать, что один цикл меньше, чтобы настроить стиль – charlietfl

+0

по любой причине, по которой вы не используете css для создания четных и нечетных строк вместо jquery? – Andbdrew

+0

Я сделал (хотя это не работает для старых браузеров), но теперь это не работает, так как я фильтрую данные. CSS не учитывает скрытые строки при окрашивании – katit

ответ

1

Используйте объект обещания для анимации.

 $("*[id$='StateDropDownList']").change(function() { 
      var filtervar = $(this).val(); 
      $('tr td.readyState').each(function() { 
       if (filtervar == "Any" || $(this).text() == filtervar) { 
        $(this).parent().fadeIn(); 
       } else { 
        $(this).parent().fadeOut(); 
       } 
      }).parent().promise().done(colorGridRows); 

      //colorGridRows(); 
     }); 
+0

Хмм. Я думал, что это сработало, но оно не работает надежно. Когда я нажимаю вверх/вниз по выпадающему списку, он фильтрует данные, но не окрашивает строки должным образом. – katit

+0

Обновлено мое первоначальное сообщение, показывающее, как я пытаюсь использовать обещание() без везения :( – katit

+0

Это работает, если вы нажимаете медленно, но не быстро? I ожидайте, что возникнут проблемы, если вы нажмете быстро, что является совершенно другой проблемой. –

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