Полный календарь. Удалить перетаскиваемые события из внешнего списка

Я использую Fullcalendar 4 и у меня проблема с обновлением событий. Я меняю источник событий с помощью раскрывающегося меню, но я могу обновлять только события, которые хранятся в json, а не события, которые были перетащены динамически. Я использую следующий код.

calendar.destroy();
var eventSources = calendar.getEventSources();
var len = eventSources.length;
for (var i = 0; i < len; i++) { 
eventSources[i].remove(); 
}
var url = './demo2/contents/calendar/get.php?source='+source;
calendar.addEventSource(url);
calendar.refetchEvents();
calendar.render();

Как я могу добавить все перетаскиваемые события в новый источник, используя eventReceive?

eventReceive: function(info) {
calendar.addEvent(event,  [, source ]);    
},

Внешний список создается с помощью приведенного ниже кода. Я попытался указать исходное местоположение, но, похоже, не работает, когда я перетаскиваю его из внешнего списка:

var initDrag = function(el,value) {

 var eventObject = {

 id: el.attr("data-id"),
 startEditable: true,
 allDay: false,
 durationEditable: true,
 title: $.trim(el.text()), // use the element's text as the event title
 stick: true, // maintain when user navigates (see docs on the renderEvent method)
 classNames: [el.attr("data-color"),],
 description: 'Lorem ipsum dolor eius mod tempor labore',
 source: 'planificacion'
 };

 // store the Event Object in the DOM element so we can get to it later
 el.data('event', eventObject);

 };

person vance    schedule 03.10.2019    source источник
comment
если вы не связали перетаскиваемое событие с источником события при добавлении его в календарь, то они будут существовать вне каких-либо источников событий, и вам придется удалить их напрямую (вы можете использовать fullcalendar.io/docs/Calendar-getEvents, чтобы получить все события, или fullcalendar.io/docs/Calendar-getEventById, чтобы получить конкретное событие, если вы знаете идентификатор, и fullcalendar.io/docs/Event-remove, чтобы удалить определенное событие).   -  person ADyson    schedule 03.10.2019
comment
P.S. если вы хотите получать события из динамического источника (например, URL-адреса), вам, как правило, не нужно уничтожать календарь, удалять источник событий и создавать его заново. Если URL-адрес может измениться, если вы следуете шаблону events-as-JSON , вы можете установить динамические параметры для fullCalendar, чтобы они собирались и добавлялись к URL-адресу каждый раз, когда он извлекает события — см. раздел Динамический параметр extraParams на связанной странице. Таким образом, вы можете просто вызвать метод refetchEvents, а fullCalendar сделает все остальное.   -  person ADyson    schedule 03.10.2019
comment
(И даже если по какой-то причине вы по-прежнему хотите добавить/удалить источник события вручную, шаги по уничтожению/рендерингу определенно излишни. refetchEvents приведет к повторному рендерингу событий, но на самом деле нет необходимости весь календарь)   -  person ADyson    schedule 03.10.2019
comment
спасибо ADyson, как я могу связать события с источником?   -  person vance    schedule 03.10.2019
comment
У меня была игра с этим. Это возможно только с помощью довольно неуклюжего обходного пути - вам нужно дождаться получения события, затем удалить его из календаря, сделать его клонирование по свойствам и снова добавить его в календарь через метод addEvent, указав желаемый источник события в качестве второго аргумента. addEvent кажется единственным методом, с помощью которого вы можете успешно связать событие с источником, помимо фактической доставки события в ленту этого источника для начала.   -  person ADyson    schedule 04.10.2019
comment
Демонстрация этого: codepen.io/ADyson82/pen/MWWgQKQ?editors=1010 . Перетащите пару событий в календарь, а затем нажмите кнопку удаления источника события, и вы увидите, что перетаскиваемые события удаляются вместе с исходными данными источника событий. Тот факт, что этот процесс необходим, кажется мне небольшой дырой в наборе функций fullCalendar.   -  person ADyson    schedule 04.10.2019
comment
это сработало. но есть ли способ указать во внешнем списке событий исходное местоположение? Я опубликую код выше..   -  person vance    schedule 04.10.2019
comment
Кажется, нет способа, нет. Я пробовал много вещей, прежде чем придумал этот обходной путь. Возможно, вам следует сделать запрос функции   -  person ADyson    schedule 04.10.2019
comment
хорошо, спасибо еще раз. вы сэкономили мне дни работы. :)   -  person vance    schedule 04.10.2019
comment
Единственное, если вы хотите указать источник во внешних данных, вы можете установить его как свойство в eventData, а затем прочитать это свойство как второй аргумент в addEvent, например. calendar.addEvent(newEvent,evt.source); . Так что это все еще косвенно, но вы можете, по крайней мере, сделать его переменным.   -  person ADyson    schedule 04.10.2019
comment
отличный. но мне пришлось написать такой код. Это правильно или я неправильно определил его в eventData? calendar.addEvent(newEvent,evt.extendedProps.source);   -  person vance    schedule 04.10.2019
comment
Нет, все верно, все, что не считается стандартным свойством, будет помещено в коллекцию extendedProps, когда fullCalendar обработает ее — см. fullcalendar.io/docs/event-parsing . Это новинка в v4, я и забыл. Вы не сделали ничего плохого.   -  person ADyson    schedule 04.10.2019


Ответы (1)


спасибо, Эдисон, ты решил мою проблему. это решение сработало.

eventReceive: function(info) { // called when a proper external event is dropped

 var evt = info.event;
 evt.remove();
 var newEvent = {};
 //clone the object - doesn't work if we just pass evt straight to the addEvent method
 for (prop in evt) {
 newEvent[prop] = evt[prop];
 }

 calendar.addEvent(newEvent,'planificacion');

}
person vance    schedule 04.10.2019
comment
Я обновился до fullcalendar v5 и снова столкнулся с этой проблемой. Я могу заставить его работать, добавив вручную addEvent. Копирование всего объекта не работает... не понимаю почему.. calendar.addEvent({id: info.event.id, title: info.event.title, start: starttime, Day: true, },source); - person vance; 14.09.2020