datePicker onMonthChange & beforeShowDay getJSON-запрос не может быть выполнен, если календарный месяц быстро перебрал - PullRequest
3 голосов
/ 24 ноября 2011

Я постараюсь держать это коротко и по существу.

У меня есть настройка datePicker, которая используется для сайта размещения, чтобы установить даты заезда / выезда.Я использую beforeShowDay, чтобы запросить файл XML, который содержит данные о доступности и скорости.Я настроил и работаю правильно.

Когда месяц меняется, у меня есть функция onMonthChange для повторного запроса информации на следующие / предыдущие месяцы, это также работает, как и ожидалось, за исключениемодна важная часть:

Проблема: Если вы быстро щелкнете по месяцам, в течение которых возвращаемые данные XML не могут идти в ногу, значит, даты неверно отображаются как недоступные.

Мне нужно выполнить одно из следующих действий:

  • После загрузки данных календарь обновится, чтобы показать правильную доступность
  • Кнопка пересылки месяца отключена до тех пор, пока данные не будут загружены.

Что я пробовал

  • Скрытие изменения месяцакнопка в начале функции onMonthChange, затем показывает ее в конце - это не работает.
  • Использование async:false в функции get - я чувствую, что это решение, но я не могу заставить его работатьпоскольку я не могу найти четкую документацию о том, куда она должна идти.

Код:

        /* Date Picker */
    var datepickerOptions = {
        dateFormat: 'yy-mm-dd',
    };
    var checkInOptions = {
        showOtherMonths: false,
        minDate: 0,
        beforeShowDay: addPrice,
        onSelect: openCheckout,
        onChangeMonthYear: onMonthChange,
        dateFormat: 'yy-mm-dd'
    };

    j.getJSON("/availability.php?startDate="+year+"-0"+month+"-01&id="+j('#property_id').text(),
      { format: "json" },
      function(data) {
            document.pricesData = data;
            document.firstDate = '';
            j('#calendar_check_in').datepicker(checkInOptions);

            /* Tip Tip */
            j('.ui-datepicker-calendar td').tipTip({ defaultPosition: "right" });

            for (var key in document.pricesData) {
               var obj = document.pricesData[key];
               if(obj['avail'] == 1 && document.firstDate == ''){
                  document.firstDate = key;
               }
            }
            d = new Date(document.firstDate.substr(5));
            d.setMonth(d.getMonth()+1);

      });

function addPrice(date) {
    calDate = new Date(date);
    dateString = 'date_'+calDate.getFullYear()+'-'+('0'+(calDate.getMonth()+1).toString()).substr(-2)+'-'+('0'+(calDate.getDate()).toString()).substr(-2);
    if(document.pricesData[dateString] != undefined){
        var priceString = document.pricesData[dateString]['price'];
        if(document.pricesData[dateString]['avail'] == "1"){
            valid = true;
        } else {
            valid = false;
        }
    }else{
        var priceString = 'Price not available';
        valid = false;
    }
    return [valid, '', priceString];
}

function onMonthChange(year, month, inst){
    /* Date Picker */
    month--;
    j.getJSON("/availability.php?startDate="+year+"-0"+month+"-01&id="+j('#property_id').text(),
      { format: "json" },
      function(data) {
            document.pricesData = data;
            document.firstDate = '';
            /* Tip Tip */
            j('.ui-datepicker-calendar td').tipTip({ defaultPosition: "right" });

            for (var key in document.pricesData) {
               var obj = document.pricesData[key];
               if(obj['avail'] == 1 && document.firstDate == ''){
                  document.firstDate = key;
               }
            }
            d = new Date(document.firstDate.substr(5));
            d.setMonth(d.getMonth()+1);
      });
}

Спасибо всем, кто нашел время, чтобыПрочитайте это, надеясь, что у кого-то есть какое-то решение, потому что в данный момент это немного похоже на пробку!

Спасибо!

1 Ответ

0 голосов
/ 24 ноября 2011

Если вы быстро щелкнете по месяцам, в течение которых возвращаемые данные XML не могут идти в ногу, поэтому даты неправильно отображаются как недоступные.

Когда пользователь меняет месяцы в средстве выбора даты,Не могли бы вы очистить отображаемую информацию о ценах и наличии?Таким образом, по крайней мере, вы не будете отображать неверные данные.Затем, если необходимо, вы можете добавить сообщение, информирующее пользователя о том, что другие данные все еще загружаются.

Я бы настоятельно рекомендовал не использовать async: false.Это похоже на ядерный вариант.Это будет иметь другие негативные последствия для сайта и не похоже, что это действительно нужно в вашем случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...