Подтвердить что ты не робот

Как запустить beforeShowDay из DatePicker из другой функции

У меня есть Datepicker со следующим кодом. У меня есть dropdownbox, и после изменения в поле dropDown я хочу запустить функцию datePicker beforeShowDay. Как я могу это сделать?

var freeDate;

Часть моего кода выглядит следующим образом:

$("#myDiv").datepicker({
    showOtherMonths: true,
    selectOtherMonths: true,
    dateFormat: "yy/mm/dd",
    onSelect: function(dateText, inst) {},
    onChangeMonthYear: function(year, month, inst) {
        $.ajax({
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            url: '@Url.Action("ListDates", "Party")',
            data: {
                date: new Date(year, month - 1, 1).toString("yyyy/MM/dd"),
                userID: userID
            },
            success: function(data) {
                freeDate = eval(data);
            },
            error: function(request, status, error) {}
        });
    },
    beforeShowDay: function(dateToShow) {
        var returnResult = new Array();
        returnResult.push(true);
        var itemMatched = false;
        $.each(freeDate, function(key, value) {
            if (new Date(parseInt(value.substr(6))).compareTo(dateToShow) == 0) {
                itemMatched = true;
                returnResult.push('timeNotFree');
                return;
            }
        });
        if (!itemMatched) returnResult.push('');
        returnResult.push('');
        return returnResult;
    }
});​

$('#myList').change(function() {
    userID = $("#userList > option:selected").attr("value");
    // myList is used to have freeDate and the DatePicker must be shown accordingly.
    $.ajax({
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        url: '@Url.Action("ListDates", "Party")',
        data: {
            date: new Date($("#myDiv").datepicker("getDate").toString("yyyy/MM/dd")),
            userID: userID
        },
        success: function(data) {
            freeDate = eval(data);
        },
        error: function(request, status, error) {}
    });
    $("#myDiv").datepicker("setDate", $("#myDiv").datepicker("getDate").toString("yyyy/MM/dd"));
});​
4b9b3361

Ответ 1

beforeShowDay - событие, которое запускается datepicker перед тем, как будет сделан день. Вы можете использовать его для настройки отображения ячейки, содержащей день. вы можете повернуть его красным цветом, чтобы указать заблокированные даты.

Из того, что я понимаю из вашего вопроса, вы можете вызвать метод datapicker.refresh(), чтобы указать, что переменная freeDate изменилась ( например, с помощью ответа AJAX), и календарь нужно снова отобразить.

Изменить

Я считаю, что это код для выпадающего списка, кажется, что он использует ajax:

$('#myList').change(
...

В обратном вызове успеха у вас есть:

freeDate = eval(data);

Здесь freeDate изменяется, и это, вероятно, вы должны вызвать метод .refresh(). Обратите внимание, что по умолчанию AJAX является асинхронным, поэтому между выбором значения и обратным вызовом события успеха существует некоторая задержка.

И вот как вы вызываете метод на существующем datepicker:

.
.
.
freeDate = eval(data);
$("#myDiv").datepicker("refresh");
.
.
.

Ответ 2

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

EDIT: добавлено уточнение.

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

Что-то вроде этого:

function doMyThing(dateToShow){
   // do stuff
}

$("#myDiv").datepicker({
    ...
    beforeShowDay: function(dateToShow){
        doMyThing(dateToShow);
    }
});  

$('#myList').change(function () {
    doMyThing(dateToShow);
});  

Единственное, что я не уверен в том, что вы хотите передать как параметр в onchange. Поскольку это не действие щелчка по дате, я не знаю, что такое dateToShow.