Почему этот код синтаксического анализа JSON Javascript / JQuery не работает? - PullRequest
1 голос
/ 18 сентября 2009

Вот мой код jQuery. Он должен анализировать json, возвращаемый этим PHP-скриптом. Известно, что PHP работает. Также следует преобразовать литералы даты в объект даты в JavaScript. Однако ошибка возникает в dates.length. Кто-нибудь может увидеть, что не так с кодом?

if($("#calendar").length)
{
    var dates;
    $.post("/dates/jsondates.php",function(data)
    {
        for(var i=0; i<data.length; i++)
        {
            data[i].start = new Date(data[i].start);
            data[i].end = new Date(data[i].end);
        }
        dates = data;
    }, "json");

    $("#calendar").datepicker(
    {
        beforeShowDay: function(date)
        {
            for(var i=0; i<dates.length; i++)
            {
                if(dates[i].start<date<dates[i].end)
                {
                    return new Array(0, "booked", dates[i].comment);
                }
            }
            return new Array(1);
        }
    });
}

Ответы [ 2 ]

1 голос
/ 18 сентября 2009

Ваш код datepicker будет (потенциально) выполняться до завершения вызова ajax. Как минимум, попробуйте переместить часть кода DatePicker в обратный вызов $ .post: -

if ($("#calendar").length)
{
    var dates;
    $.post("/dates/jsondates.php",function(data)
    {
        for(var i=0; i<data.length; i++)
        {
                data[i].start = new Date(data[i].start);
                data[i].end = new Date(data[i].end);
        }
        dates = data;

        $("#calendar").datepicker(
        {
            beforeShowDay: function(date)
            {
                    for(var i=0; i<dates.length; i++)
                    {
                            if(dates[i].start<date<dates[i].end)
                            {
                                    return new Array(0, "booked", dates[i].comment);
                            }
                    }
                    return new Array(1);
            }
        });
    }, "json");

}

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

function __callDateController(callback)
{
    $.post("/dates/jsondates.php",function(data)
    {
        for(var i=0; i<data.length; i++)
        {
            data[i].start = new Date(data[i].start);
            data[i].end = new Date(data[i].end);
        }

        if (callback !== undefined) {
            callback(data);
        }
    }, "json");
}

А затем отправьте обратный вызов, чтобы ваш обработчик даты имел дело с: -

__callDateController(function(dates)
{
    $("#calendar").datepicker(
        {
            beforeShowDay: function(date)
            {
                for(var i=0; i<dates.length; i++)
                {
                    if(dates[i].start<date<dates[i].end)
                    {
                        return new Array(0, "booked", dates[i].comment);
                    }
                }
                return new Array(1);
            }
        });
    });
1 голос
/ 18 сентября 2009

Проблема в том, что ваш код выбора даты в календаре выполняется до завершения обработки AJAX.

Ваш код datePicker должен находиться внутри функции обратного вызова $ .post, под циклом for и под строкой dates = data;

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