FullCalendar 事件对象:非标准字段 (GCal)

FullCalendar Event Object: Non-standard Fields (GCal)

FullCalendar (FC) 文档状态

Non-standard Fields In addition to the fields above, you may also include your own non-standard fields in each Event Object. FullCalendar will not modify or delete these fields. For example, developers often include a description field for use in callbacks such as eventRender. [Source: Event Object]

以及 Google 日历事件源

Advanced: Extended Properties Google Calendar’s API allows you to specify Extended Properties for your events. The extended properties will be available as the extendedProperties hash that is attached to each Event Object. [Source: events from Google Calendar]

然而,尚不清楚哪些 GCal eventSource 属性属于标准属性,哪些属性属于非标准属性。

‍‍‍‍‍‍‍‍

假设第一个事件对象文档中列出的属性也可用作 GCal eventSources 的标准属性,这意味着其他任何内容都可能是非标准字段,对吗?

如果我想查询给定 FC 事件的创建者字段,例如creator.displayNamecreator.email 根据 Google API 参考文档 events#extendedProperties 它出现在事件弹出窗口的底部,即 "Created by: ... "(在 Google 日历中,而不是 FC),但我不确定如何完成此操作。 ‍‍‍‍‍‍‍‍

我无法在任何地方找到 FullCalendar (v3) GCal eventSources 的标准和非标准字段的完整列表, 没关系 Docs/examples 如何访问这些属性.

‍‍‍‍‍‍‍‍

总之尝试了以下操作:

console.log(event.extendedProperties.creator.displayName);
console.log(event.extendedProperties.creator.email);

刚刚生产

jquery-3.3.1.min.js:2 jQuery.Deferred异常:无法读取属性'displayName'未定义类型错误:无法读取未定义

的属性'displayName'

‍‍‍‍‍‍‍‍

果然event.extendedProperties.creator确实产生了undefined。但是接下来我尝试了:

console.log(event.extendedProperties);
console.dir(event.extendedProperties);

这并没有产生错误,而是出现了一个空对象

Screen shot of console.dir(event.extendedProperties)

因此,如果它什么也没返回(即空对象),可以公平地假设我正在查询的给定事件没有扩展属性,并且假设创建者字段可能也是合理的:creator.displayNamecreator.email 毕竟不是 非标准字段 或者至少不是扩展属性类型。

等一下,这是否意味着我们正在处理的非标准字段列表中可能有两种类型,还是我盯着这个屏幕看得太久了?

‍‍‍‍‍‍‍‍

最后我尝试仔细检查以确保它们不是事件对象的一部分。

console.log(event.creator.displayName);
console.log(event.creator.email);

但这又导致了

未捕获类型错误:无法读取未定义

的属性'displayName'

‍‍‍‍‍‍‍‍


我完全不知所措。我应该如何获取 FullCalendar 网站上未提及的字段,也似乎是扩展属性?

我是否遗漏了任何内容,或者是否存在我不知何故遗漏的 Standard/Non-standard 个字段的列表?


Any ideas on how to obtain these creator fields would be much appreciated.

‍‍‍‍‍‍‍‍

‍‍‍‍‍‍‍‍

我看不出任何类型的代码示例在这里会有什么帮助,但正如我最近被告知的那样“Stack Overflow 上几乎总是需要代码”所以对于为了合规,这是我的代码示例 ...

<div id='calendar'></div>
<script>
$(function() {
  $('#calendar').fullCalendar({
    googleCalendarApiKey: '%googleCalendarApiKey%',
    events: {
      googleCalendarId: 'lph029pf163sce67stdgfcdpfg@group.calendar.google.com' //imdb UK
    },
    defaultView: 'month',
    eventRender: function(event, element) {
      element.popover({
        animation:true,
        delay: 300,
        title: event.title,
        content: event.description, // + req << creator.displayName/email >>  e.g."Created by: imdbreleases@gmail.com"
        placement: 'auto',
        trigger: 'hover'
      });
    }
  });
});
</script>

PS 没有按照建议创建 CodePen 不要分享 GoogleAPIKey

当 fullCalendar 文档说

Google Calendar’s API allows you to specify Extended Properties for your events. The extended properties will be available as the extendedProperties hash that is attached to each Event Object.

它们指的是您可能在 Google 日历事件中定义的额外自定义字段 - 日历 API 不支持或不提供的字段作为标准。这些是 fullCalendar 将复制为 "extra" 的字段。 不是指的是"any fields which fullCalendar normally doesn't regard as standard".

现在,因为 Calendar API 返回的事件数据结构中几乎 none 会直接映射到 fullCalendar 要求您提供的数据结构,以便构建有效的事件对象 (查看 Event Object docs 中 fullCalendar 的 "standard" 字段列表),我们不能简单地将日历 API 的 JSON 输出直接提供给 fullCalendar 并期望它工作并自动映射田野。

这就是为什么 fullCalendar 提供了 gcal.js 文件作为连接到 API 的便利实用程序,检索事件数据并将其转换为 fullCalendar 期望和理解的格式。显然,开发人员选择了将哪些字段从一个字段转移到另一个字段。由于正在构造一个新对象以传递给 fullCalendar,因此没有任何类型的自动映射——它完全依赖于代码中编写的内容。通常,如果您将 JSON 提供给 fullCalendar direct,它还会复制它在对象中找到的任何其他字段,除了它实际识别为 "standard" 的字段(即标准字段是它用于具体用途如文档中所述)。但是同样,由于代码为 fullCalendar 创建了新对象,所以这也不会发生。

除了 "extendedProperties" 上的注释外,没有明确的文档说明代码将哪些字段从 API 输出复制到与 fullCalendar 兼容的事件对象中。在您的页面中使用 console.log($("#calendar").fullCalendar("clientEvents")); 进行快速实验将揭示最终事件具有哪些属性,但您也可以查看源代码。在撰写本文时,fullCalendar v3 的最新版本是 3.10,该版本的 gcal.js 源代码(可查看 here)。

该代码包含以下片段,用于将 API 数据转换为 fullCalendar 对象:

    return {
        id: item.id,
        title: item.summary,
        start: item.start.dateTime || item.start.date,
        end: item.end.dateTime || item.end.date,
        url: url,
        location: item.location,
        description: item.description,
        extendedProperties: extendedProperties
    };

在您的问题和评论中,您提到您会对日历 API 提供的 creatordescription 字段感兴趣。这些是 GCal 中的标准字段(根据 resource representation docs),因此不会在 "extendedProperties" 集合中。您还可以看到 description 已被 gcal.js 复制,即使它不是 fullCalendar 通常使用的字段 - 但是如果您想在日历中使用它,它就在那里。

因此,要使 creator 字段(或 GCal 属性中的任何其他字段)在您的 fullCalendar 事件中可用,您需要做的就是将其包含在 gcal.js 复制的数据中。例如:

    return {
        id: item.id,
        title: item.summary,
        start: item.start.dateTime || item.start.date,
        end: item.end.dateTime || item.end.date,
        url: url,
        location: item.location,
        description: item.description,
        extendedProperties: extendedProperties,
        creator: item.creator
    };

当然,如果您通过 CDN 包含 gcal.js / gcal.min.js,您需要更改代码以托管您自己的修改版本。


顺便说一句,如果您觉得 fullCalendar 项目作为一个整体受益于默认包含更多来自 GCal 的字段,那么由于 fullCalendar 是一个开源社区项目,您可以自由 make a feature request to get changes made to the gcal utility (which is really just a convenience add-on as a layer between fullCalendar's standard functionality and the Google Calendar API), or even make a code contribution 包含建议的更改,供维护人员考虑包含在主版本中。如果做不到这一点,您可以继续维护 gcal.js 的修改版本,甚至可以将其完全替换为您自己的与日历 API.

交互的实用程序