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

时间:2019-03-18 15:24:19

标签: javascript fullcalendar google-calendar-api fullcalendar-3

FullCalendar(FC)文档状态

  

非标准字段,除了上面的字段外,您还可以   在每个事件对象中包括您自己的非标准字段。   FullCalendar不会修改或删除这些字段。例如,   开发人员通常会在回调等中包含描述字段   作为eventRender。 [来源:Event Object]

以及Google日历事件源

  

高级:扩展属性,您可以使用Google Calendar API为事件指定扩展属性。扩展属性   将作为附加到的ExtendedProperties哈希值提供   每个事件对象。 [来源:events from Google Calendar]

但是还不清楚的是,哪些GCal eventSource属性被分类为标准属性,哪些是非标准的。

‍‍‍‍‍‍

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

如果我想查询给定FC事件的创建者字段,例如根据{{​​3}}的Google API参考文档, creator.displayName creator.email 出现在事件弹出窗口的底部,即“创建者:... ”(在Google日历中,不是FC),但我不确定如何完成此操作。 ‍‍‍‍‍‍

我在任何地方都找不到FullCalendar(v3)GCal eventSource的标准和非标准字段的完整列表,没关系如何访问这些属性的文档/示例。

‍‍‍‍‍‍

任何人尝试以下操作:

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确实产生了未定义。但是接下来我尝试了:

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

没有产生错误,而是出现了空对象

events#extendedProperties

因此,如果返回时没有任何结果(即空对象),则可以合理地假设我要查询的给定事件不具有extendedProperties,并且可以合理地假设创建者字段为: creator.displayName creator.email 并不是全部或至少不是扩展属性类型的非标准字段

请稍等,这是否意味着我们正在处理的“非标准字段”列表中可能有两种类型,或者我盯着这个屏幕停留了太长时间?

‍‍‍‍‍‍

最后,我尝试仔细检查以确保它们已不属于事件对象。

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

但这又导致了

未捕获的TypeError :无法读取未定义的属性“ displayName”

‍‍‍‍‍‍


我完全不知所措。我应该如何获取FullCalendar网站上任何地方都没有提到的字段,或者看起来不是扩展属性的字段?

我是否忽略了任何内容,或者是否存在我设法以某种方式错过的标准/非标准字段清单?


  

关于如何获取这些 creator 字段的任何想法都会很多   感谢。

‍‍‍‍‍‍

‍‍‍‍‍‍

我看不到任何形式的代码示例在这里都会有什么帮助,但是正如我最近被告知:“ 在堆栈溢出中几乎总是需要代码”,因此为了合规起见,这里是我的代码样本...

<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

1 个答案:

答案 0 :(得分:1)

当完整的日历文档说出

  

通过Google Calendar的API,您可以为   您的活动。扩展属性将作为   附加到每个事件对象的extendedProperties哈希。

它们是指您可能已在Google Calendar事件中定义的其他自定义字段-Calendar API作为标准不支持或未提供的字段。这些是fullCalendar将复制为“额外”的字段。 是指“ fullCalendar 通常不视为标准的任何字段”。

现在,因为Calendar API返回的事件数据结构几乎都不会直接映射到fullCalendar要求您提供的数据结构,以构造有效的事件对象(请参见参考资料中fullCalendar的“标准”字段列表) Event Object docs),我们不能简单地将Calendar API的JSON输出直接提供给fullCalendar并期望它能够正常工作并自动映射字段。

这就是为什么fullCalendar提供了gcal.js文件作为便利实用程序来连接到API,检索事件数据并将其转换为fullCalendar期望并理解的格式的原因。显然,开发人员可以选择要从哪个领域转移到另一个领域。由于正在构造一个新对象以传递给fullCalendar,因此没有任何类型的自动映射-所有这些都依赖于代码中编写的内容。通常,如果将JSON提供给fullCalendar Direct,则它还会在对象中找到的所有其他字段之间进行复制,除了它实际识别为“标准”的字段外(即标准字段是用于特定目的的字段,如文档)。但是,由于代码再次为fullCalendar创建了新对象,因此也不会发生这种情况。

除了有关“ extendedProperties”的注释外,没有任何明确的文档来说明代码从API输出复制到完全兼容日历的事件对象的哪些字段。在页面中使用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
    };

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

因此,要使fullCalendar事件中的creator字段(或GCal属性中的任何其他字段)可用,只需将其包含在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,则需要更改代码以托管自己的修改版本。


顺便说一句,如果您认为默认情况下包含更多来自GCal的字段,那么fullCalendar项目将整体上受益,那么由于fullCalendar是开源社区项目,您可以自由使用{{3} }进行gcal实用程序的更改(这实际上是在fullCalendar的标准功能和Google Calendar API之间的一个方便的附加组件),或者甚至是make a feature request包含建议的更改,供维护者考虑包含在主版本中。如果失败,则可以继续维护修改后的gcal.js版本,甚至可以将其完全替换为您自己的实用程序,以便与Calendar API进行交互。