Плагин jQuery с $ .getJSON Возвращает неопределенный? - PullRequest
0 голосов
/ 15 июня 2010

Внутри плагина jQuery, который я сделал, у меня есть:

$.getJSON(base_url,{
    agenda_id:defaults.id,
    action:defaults.action+defaults.type,
    output:defaults.output
},function(json){
    return json;
});

И в отдельном файле JS (да, он идет после плагина):

json = $('#agenda-live-preview').agenda({action:'get',type:'agenda',output:'json'});
alert(json[0].agenda_id);

Если я это сделаювышеуказанный $ .getJSON и поместить предупреждение внутри $ .getJSON, он работает и возвращает «3», что правильно.Если я делаю это как json=$('#agenda-live-preview').agenda(...)..., он возвращает неопределенное значение.

Мой JSON действителен, и json [0] .agenda_id также верен, я знаю, что он находится в обратном вызове, так как я могу получить материалвнутри функции обратного вызова в функции return?

1 Ответ

1 голос
/ 15 июня 2010

Поскольку запрос AJAX по умолчанию является асинхронным, alert() выполняется до получения запроса AJAX, и поэтому переменной json не было присвоено значение.

Какой бы функции вы не хотели (например, предупреждение) должно быть в обратном вызове к запросу AJAX, или должно быть в функции, вызываемой из обратного вызова, или, возможно, вызываемой с помощью .ajaxSuccess().

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


РЕДАКТИРОВАТЬ:

Примерпередачи обратного вызова для выполнения успешного $.getJSON() запроса:

$.fn.agenda = function(opts) {

    var defaults = {...} // your defaults

    $.extend(defaults, opts); // Extend your defaults with the opts received

    $.getJSON(base_url,{
        agenda_id:defaults.id,
        action:defaults.action+defaults.type,
        output:defaults.output
    },function(json){
        defaults.success.call(this,json);  // Call the 'success' method passing in the json received
    });
};

$('#agenda-live-preview').agenda({
    action:'get',
    type:'agenda',
    output:'json',
    success:function(data) {  // Pass a function to the plugin's 'success' property
        alert(data[0].agenda_id);
        alert( $(this).selector );
    }
});
...