Как получить данные из обратного вызова jquery в родительскую функцию - PullRequest
0 голосов
/ 27 сентября 2010

Я использую код перетаскивания пользовательского интерфейса jquery. После удаления выполняется запрос getJSON для проверки новых данных и обновления базы данных. Это работает нормально, пока мой сервер не вернет ошибку, потому что я не могу отменить удаление из анонимной функции.

В случае ошибки сервер возвращает json, который выглядит следующим образом:

{"result":0}

Это код, обрабатывающий сброс:

 $('.droppable').droppable({
  drop: function(event, ui) {
   $.getJSON('/roster/save', 'location_id=1', function (){
    if (data.result==0) {
     // now the drop should be cancelled, but it cannot be cancelled from the anonymous function
    }
   });

   // if data was available here I could check the result and cancel it
   if (data.result==0)
    return false; // this cancels the drop

   // finish the drop
   ui.draggable.appendTo($('ul', this));
  }});

Надеюсь, это немного понятно. Есть идеи? :)

Ответы [ 2 ]

0 голосов
/ 27 сентября 2010

Почему бы не присвоить ваши данные json новой глобальной переменной, которая должна быть доступна вне вашей функции getJson?

$('.droppable').droppable({
    drop: function(event, ui) {
        $.getJSON('/roster/save', 'location_id=1', function (){
            jsonData = data;
        });

        // if data was available here I could check the result and cancel it
        if (jsonData.result==0)
        return false; // this cancels the drop

        // finish the drop
        ui.draggable.appendTo($('ul', this));
    }
});
0 голосов
/ 27 сентября 2010

Ну, пока я не найду менее уродливое решение, я буду использовать синхронный вызов ajax в сочетании с методом jQuery .data ().Поэтому вместо вызова .getJSON ():

$.ajax({  
 async: false,
 type: "POST",  
 url: "/roster/add",  
 data: 'location_id=1',  
 dataType: 'json',
 success: $.proxy(function(data) { $(this).data('tmp',data) }, $(this)),
});  

Затем я могу проверить значение сохраненных данных и при необходимости вернуть false:

if (this).data('tmp').result != 1) {
 return false;
}

Надеюсь, это кому-нибудь поможет.

...