remove refetchevents example data clientevents all javascript jquery calendar fullcalendar

javascript - refetchevents - fullcalendar remove all events



El método fullCalendarjs fullCalendar(''clientEvents'') devuelve eventos duplicados (1)

clienteEventos

Recupera los eventos que FullCalendar tiene en la memoria.
.fullCalendar( ''clientEvents'' [, idOrFilter ] ) -> Array

Entonces devuelve una variedad de eventos.

Usted lo almacena, recrea el FC y luego agrega el origen de cada evento. Pero las fuentes son URL y lo mismo para muchos eventos , por lo que obtienes duplicados.

Básicamente lo estás haciendo

$(''.my-calendar'').fullCalendar(''addEventSource'', {url:"/myfeed"}); $(''.my-calendar'').fullCalendar(''addEventSource'', {url:"/myfeed"});

que te dará duplicados.

Entonces, para solucionarlo, puede buscar duplicados y no agregarlos. Agregue el método a continuación:

var filterOutDuplicateEventSources = function(allEventSources){ var hash = {}; var remainingEventSources = []; var arrayLength = allEventSources.length; for (var i = 0; arrayLength !== 0 && i < arrayLength; i++) { var currentEventSource = allEventSources[i]; var currentEventSourceUrl = currentEventSource.url; if(currentEventSourceUrl){ if(hash[currentEventSourceUrl] === 1){ continue; //skip this event source, we''ve already added it }else{ hash[currentEventSourceUrl] = 1; // remember that we add this currentEventSourceUrl remainingEventSources.push(currentEventSource); } }else{ //handle non-url event sources } } return remainingEventSources; }

Use este método tal como:

// Get all event sources var allEventSources = []; var arrayLengthClientEvents = clientEvents.length; for (var i = 0; i < arrayLengthClientEvents; i++) { allEventSources.push( clientEvents[i].source ); } // Filter out duplicated event sources var remainingEventSources = filterOutDuplicateEventSources( allEventSources );

Alternativamente

Técnicamente, no creo que clientEvents esté destinado a ser utilizado de esa manera. Lo que realmente necesitas es un método eventSources . Pero no existe (podría ser una buena solicitud de función ).

Probablemente intentaría almacenar el estado del evento del calendario fuera de fullcalendar. Dijiste que tienes botones que encienden y apagan las cosas, ¿se trata básicamente de botones? ¿Es posible determinar el estado simplemente consultando sus diversos controles? Algo en ese sentido podría ser una mejor solución. Tal vez.

Estoy usando fullcalendar.io

Completo dinámicamente mi calendario, agregando eventos a través de evenSources. Como:

$(''.add-more-events'').on(''click'', function(){ var myEventSourceUrl = // ... get the event source url somehow var eventSourceColor = // ... get the color for this source var eventSource = { type: ''GET'', url: myEventSourceUrl, color: eventSourceColor }; $(''.my-calendar'').fullCalendar(''addEventSource'', eventSource); }

Asimismo, dinámicamente un populate mi calendario, eliminando eventos a través de eventSource. Como:

$(''.remove-some-events'').on(''click'', function(){ var myEventSourceUrl = // ... get the event source url somehow var eventSourceColor = // ... get the color for this source var eventSource = { type: ''GET'', url: myEventSourceUrl, color: eventSourceColor }; $(''.my-calendar'').fullCalendar(''removeEventSource'', eventSource); }

Hasta ahora, todo bien: visualmente, los eventos aparecen en el calendario (poblados) y desaparecen en el calendario (despoblados) como se esperaba. Es decir, cada vez que hago clic en el botón correspondiente.

En algún momento, quiero reiniciar mi calendario y volver a mostrar los eventos que estuvieron presentes por última vez en mi calendario (mantenga el último evento Fuentes supuestamente).

El seudo código se vería así:

1. Back up my events 2. Destroy my calendar 3. Create & initialize new calendar 4. Add the backed up events (see step 1) to the new calendar

Así que implementé lo anterior como:

var clientEvents = $(''.my-calendar'').fullCalendar(''clientEvents''); /* [1] */ $(''.my-calendar'').fullCalendar(''destroy''); /* [2] */ $(''.my-calendar'').fullCalendar(calendarOptions); /* [3] */ var arrayLengthClientEvents = clientEvents.length; for (var i = 0; i < arrayLengthClientEvents; i++) { $(''.my-calendar'').fullCalendar( ''addEventSource'', clientEvents[i].source); /* [4] */ }

Pero por alguna razón, obtengo eventos duplicados cuando llamo $(''.my-calendar'').fullCalendar(''clientEvents'') .

Nota: parece estar sucediendo al cambiar de semana, aunque no estoy seguro de esto, puede no estar relacionado.

Recursos: