2013-06-01 3 views
0

Я использую fullcalendar для представления событий моих участников сайта. Каждый может добавить собственное событие. Каждое событие должно иметь уникальный идентификатор, который я получаю с помощью SELECT INCREMENT (MAX ('id')) в PHP. Затем правильное var передается JavaScript, и вот проблема. Число присваивается функции fullcalendar renderEvent во второй попытке добавления нового события. Сначала нажмите на календарь, переменная пуста, как объявлено (в переменной namedEventId).

Вот мой код:

function showCalendar() { 

     var date = new Date(); 
     var d = date.getDate(); 
     var m = date.getMonth(); 
     var y = date.getFullYear(); 
     var newEventId = ''; 

     $('#kalendarz').fullCalendar({ 
      header: { 
       left: 'prev,next today', 
       center: 'title', 
       right: 'month' 
      }, 
      editable: false, 
      dayClick: function(e) 
      { 

       $.getJSON('/ajax/call/bands/AddEvent', function(data) { 
        newEventId = data.dane; 
       }); 
       console.log(newEventId); // <- empty, then with ID at second click... 
       $("#kalendarz").fullCalendar('renderEvent', 
         { 
          title: 'Termin zajęty', 
          start: e, 
          id: newEventId 
         }); 
      }, 
    }); 
    } 

В чем проблема? Функция renderEvent не ждет, когда getJSON завершит работу? Могу ли я это исправить?

+0

$ .getJSON - AJAX, AJAX - асинхронный! –

+1

Исправление состоит в том, чтобы перестроить ваш скрипт, чтобы разрешить асинхронный вызов Ajax. Независимо от того, что вы хотите сделать после того, как '$ .getJSON()' должен быть в функции, вызванной из обратного вызова '$ .getJSON()'. – nnnnnn

ответ

2

$.getJSON AJAX, AJAX является асинхронным! Установите его внутри функции обратного вызова $.getJSON:

$.getJSON('/ajax/call/bands/AddEvent', function (data) { 
    newEventId = data.dane; 
    $("#kalendarz").fullCalendar('renderEvent', { 
     title: 'Termin zajęty', 
     start: e, 
     id: newEventId 
    }); 
}); 
2

getJson() инициирует запрос AJAX, который является асинхронным, getJSON возвращается после инициирования AJAX-запрос, но это не значит, что сам запрос уже закончил. Поэтому вы можете передать функцию onSuccess, которая будет вызываться с полученными данными, когда запрос будет завершен.

Если механизм не будет работать таким образом, вы не сможете ничего делать во время отправки запроса - представьте себе щелчок где-нибудь, который вызывает функцию вызова и как-то запускается запрос, тогда все будет ждать до запроса закончил бы: на самом высоком уровне вы даже не могли бы перемещать свою мышь, пока не получите какие-либо данные ответа; это не совсем удобно;)

Решение вашей проблемы легко, поместив весь код после вашего запрос, который зависит от его ответа внутри функции onSuccess (у вас уже есть функция)

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