2012-04-01 7 views
4

Ich benutze jquery fullcalendar, die gut funktioniert. Das einzige Problem, das ich habe, ist, wenn Sie vorwärts oder rückwärts klicken, um sich schnell durch mehrere Monate zu bewegen, versucht es immer noch mehrere Ajax-Anfragen abzuarbeiten und es wird nicht abgewartet, ob Sie tatsächlich in diesem Monat "abrechnen".Können Sie AJAX-Anfragen (für eine Monatsänderung) in jQuery FullCalendar verschieben?

Ich möchte im Grunde, dass es 1 Sekunde wartet, bevor es ein Ajax-Ereignis abfeuert, um sicherzustellen, dass der Benutzer nicht weiter als nächstes klickt.

Ist dies in jQuery Vollkalender möglich? Ich hätte gedacht, dass ein Plugin mit solchen folgenden und anderen erweiterten Funktionen diese

+1

Es ist nicht, wie es aussieht. ['fetchEvents'] (https://github.com/arshaw/fullcalendar/blob/master/src/EventManager.js) könnte monkey-patchen sein, aber ... sorta icky. Zeit, sich die Hände schmutzig zu machen :-) –

Antwort

0

Ich denke, ich habe es, im Grunde einen Timer in den Ereignissen Callback und Gas von dort setzen.

Ich dachte an so etwas wie dies zu tun:

events: function (start, end, callback) { 

     if (timer) { 
      clearTimeout(timer); 
     } 

     timer = setTimeout(function() { 
      put loadMonthData call here; 
      callback here(); 
     }, 1000); 

    } 
1
hätte

JQuery hat eine ganze Reihe von Ajax Event Handler wie ajaxSend, ajaxPrefilter und ajaxStart.

Mit der ajaxPrefilter() -Methode könnten Sie wahrscheinlich die Ajax-Anforderung vor dem Senden erfassen, verzögern und wenn ein Klickereignis in den Monatsnavigator-Tasten nicht innerhalb des Zeitrahmens erkannt wird, senden Sie die Anfrage, andernfalls brechen Sie sie ab.

ein bisschen ein konstruiertes Beispiel Dies ist, aber etwas in dieser Richtung könnte zu schließen, was Sie wollen:

var enableRequest = true; 

$.ajaxPrefilter(function(options, originalOptions, jqXHR) { 
    // Modify options, control originalOptions, store jqXHR, etc 

    if (!enableRequest){ 
     jqXHR.abort(); 
    } 
}); 

$('span.fc-button-prev, span.fc-button-next').click(function(){ 
    enableRequest = false; 
    setTimeout("setEnabled()", 2000) 
}); 


function setEnabled() 
{ 
    enableRequest = true; 
}); 
+0

Ich kann das hier nicht sortieren, aber diese Antwort scheint viel Potenzial zu haben. Hier ist eine Geige, die einen Kalender sowie eine Bindung an die Monatwechsel-Klick-Events enthält. Ich habe den Code eingegeben, um zu prüfen, ob Klicks innerhalb einer Sekunde stattgefunden haben. Vielleicht können Sie es erweitern, um mit ajaxPrefilter die Anfrage zu stoppen? http://jsfiddle.net/JfC6z/ – mrtsherman

+0

das ist vielversprechend. . aber Sie feuern tatsächlich nie den Ajax nach einer Sekunde ab (nur um eine Flagge zu setzen, um wahr zu sein) – leora

+0

Ich habe die Fragen mit etwas mehr Fortschritt aktualisiert, aber ich bin immer noch auf dem Callback() fest, der in der Event-Funktion existieren muss – leora

0

Könnten Sie Bearbeitung fullcalendar.js versuchen?

~ Linie 114

var fc = $.fullCalendar = { version: "1.5.3" }; 
var fcViews = fc.views = {}; 
var ajax = null; // Add this line 

~ Linie 978

pushLoading(); 
if (ajax) // add this line 
    ajax.abort(); // add this line 
    ajax = $.ajax($.extend({}, ajaxDefaults, source, { // CHange this line 
       data: data, 
       success: function(events) { 
        ajax = null; // Add this line 
        events = events || []; 
        var res = applyAll(success, this, arguments); 
        if ($.isArray(res)) { 
         events = res; 
        } 
        callback(events); 
       }, 

Auf diese Weise sollte es jede "doppelte Ajax-Abfrage" zu stoppen, denke ich.

+0

Ich kann sehen, wie diese Art von Arbeiten rund um das Problem, aber es scheint immer noch wie eine sauberere Lösung ist, um alle Ajax Anrufe überhaupt zu vermeiden, bis Sie auf einer Seite "erledigt" sind und nicht immer noch klicken. . – leora