javascript - 特定日期所有事件的总特定属性 - Fullcalendar

标签 javascript fullcalendar fullcalendar-5

要求:在每天单元格的 0..n 个事件上总计一个扩展 Prop

据我了解,我们可以利用日间单元渲染 Hook (例如日间单元内容 Hook )以及其他 Hook 来实现此目的。日期单元内容 Hook 看起来非常有前途,但是当事件并非全部在内存中并且而是异步加载时,它就无法工作,因为日期单元在数据返回之前呈现。我找不到一个好的方法来解决这个问题,也许在返回数据时重新渲染整个日历。

下面是一些示例代码,在事件位于内存中的情况下执行一些逻辑,不适用于异步事件(VueJS,但对于 Vanilla 应该类似):

injectCellContent: function(arg) { // this is the day cell content hook
  let CalendarAPI = this.$refs.calendar.getApi();
  let events = CalendarAPI.getEvents();
  let thisDate = moment(arg.date);
  let thisDaysEvents = events.filter(event => moment(event.start).isSame(thisDate, 'day'));
  console.log(thisDaysEvents); // aggregate the values for events on this day

}

大声思考,感觉将日期事件作为日期单元渲染 Hook 参数的一部分是很直观的,但我知道它们是相互解耦的。

问题:如何汇总给定日期/日期的多个事件的值?

最佳答案

虽然有点困惑,但以下是我最终实现这一目标的方法。请注意,使用日单元格渲染 Hook (我相信是dayCellContent),我首先通过injectCellContent 函数向DOM 添加了一个容器。 addEmployeeCounts 在通过回调成功重新获取源事件时调用。如果调整或移动一天的大小,则需要 native 事件的条件来重新呈现计数,再次通过完整日历选项使用回调。

 getHolderId: function(targetDate) {
   return "batch-calendar__employee-count__" + moment(targetDate, 'yyyy-mm-dd');
 },
 injectCellContent: function(arg) {
   let holder = document.createElement("div");
   holder.className = "batch-calendar__employee-count";
   holder.id = this.getHolderId(arg.date);
   arg.el.append(holder);
 },
 addEmployeeCounts: function(batchEvents, useNativeEvents) {
   let CalendarAPI = this.$refs.calendar.getApi();
   let activeStart = moment(CalendarAPI.view.activeStart);
   let activeEnd = moment(CalendarAPI.view.activeEnd);
   // loop through batchEvents by day and total employee count
   for (var m = moment(activeStart); m.isBefore(activeEnd); m.add(1, 'days')) {
     let holderID = this.getHolderId(m);
     let holder = document.getElementById(holderID);
     holder.innerHTML = "";

     let totalEmployeesForDay = 0;
     if (useNativeEvents) {
       let nativeEvents = CalendarAPI.getEvents();
       let nativeEventsCount = nativeEvents.length;
       for (var i = 0; i < nativeEventsCount; i++) {
         let thisEvent = nativeEvents[i];
         if (moment(m).isBetween(thisEvent.start, thisEvent.end, undefined, '[)')) {
           totalEmployeesForDay += thisEvent.extendedProps.service_order_item.project.employees_needed;
         }
       }
     } else {
       let batchCount = batchEvents.length;
       for (var i = 0; i < batchCount; i++) {
         let thisEvent = batchEvents[i];
         if (moment(m).isBetween(thisEvent.start, thisEvent.end, undefined, '[)')) {
           totalEmployeesForDay += thisEvent.service_order_item.project.employees_needed;
         }
       }

     }
     let holderIcon = document.createElement("span");
     holderIcon.className = "fa fa-user mr-1";
     holder.append(holderIcon)
     holder.append(totalEmployeesForDay);
   }
 },

关于javascript - 特定日期所有事件的总特定属性 - Fullcalendar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72518175/

相关文章:

javascript - 如何使用jquery获取div内链接的href?

javascript - 是否有一个服务器端 JavaScript 框架(node.js)可以在不使用模板引擎的情况下生成 html 页面?

javascript - AngularJS x-可编辑: Accept numeric input only

javascript - 如何从 laravel 元素中的 FullCalendar 中删除周和日 View 按钮?

javascript - 如何通过单击按钮在完整日历单元格中更改单元格背景颜色并添加文本(从选定的按钮)?

javascript - FullCalendar 5 - 如何在 initialView : 'timeGridWeek' instead of solid fill 中的事件左侧显示彩色点

FullCalendar v5 根据来自服务器的动态数据动态设置 slotMaxTime 和 slotMinTime

命名空间、 "this"和库的 JavaScript 问题

javascript - 如何通过代码触发日和周按钮 View 按下?

fullcalendar - 根据 View 过滤要显示的 fullCalendar (v5) 事件