Объект события FullCalendar: нестандартные поля (GCal) - PullRequest
3 голосов
/ 18 марта 2019

Состояния документации FullCalendar (FC)

Нестандартные поля В дополнение к вышеприведенным полям вы также можете включать свои собственные нестандартные поля в каждый объект события.FullCalendar не будет изменять или удалять эти поля.Например, разработчики часто включают поле описания для использования в обратных вызовах, таких как eventRender.[Источник: Объект события]

и для источников событий Календаря Google

Дополнительно: расширенные свойства API Календаря Google позволяетвам указать расширенные свойства для ваших событий.Расширенные свойства будут доступны в виде хеша extendedProperties, который прикреплен к каждому объекту события.[Источник: события из Календаря Google]

Однако не очень ясно, какие свойства GCal eventSource классифицируются как стандартные, а какие нестандартные.

‍‍‍‍‍‍ ‍‍

Предполагая, что свойства, перечисленные в первом документе объекта события, также применимы в качестве стандартных свойств для GCal, EventSources означает, что все остальное может быть нестандартным полем, верно?

Если я хочу запросить поля создателя для заданных событий FC, например, creator.displayName или creator.email в соответствии с документом Google API для документов для событий #extendedProperties , который появляется в нижней части всплывающего окна события, т.е. "Создано: ..." (в календаре Google, а не в FC), но я не уверен, как это сделать. ‍‍‍‍‍‍ ‍‍

Я не могу найти полный список стандартных и нестандартных полей для FullCalendar (v3) GCal eventSources, не обращайте внимания на Документы / примеры о том, какполучить доступ к этим свойствам.

‍‍‍‍‍‍ ‍‍

В любом случае попытался сделать следующее:

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

только что произвел

jquery-3.3.1.min.js: 2 jQuery.Deferred исключение : невозможно прочитать свойство 'displayName' с неопределенным TypeError: невозможно прочитать свойство 'displayName' с неопределенным

‍‍‍‍‍‍ ‍‍

И, конечно же, event.extendedProperties.creator выдал undefined.Однако затем я попытался:

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

, который не выдает ошибку, но вместо этого выглядит как пустой объект

Снимок экрана console.dir (event.extendedProperties)

Так что, если он вернулся ни с чем (т. Е. С пустым объектом), было бы справедливо предположить, что нет расширенных свойств для заданных событий, которые я запрашиваю, и также разумно предположить, что, возможно, создатель поля: creator.displayName и creator.email не являются нестандартными полями после всех или, по крайней мере, не относятся к типу расширенных свойств.

Подождите, это означает, что в списках нестандартных полей, с которыми мы имеем дело, может быть два типа, или я слишком долго смотрел на этот экран?10

‍‍‍‍‍‍ ‍‍

Наконец я попытался дважды проверить, чтобы убедиться, что они уже не являются частью объекта события.

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

, ноопять это привело к

Uncaught TypeError : невозможно прочитать свойство 'displayName' из неопределенного

‍‍‍‍‍‍ ‍‍


Я в полной растерянности.Как я могу получить поля, которые нигде не упомянуты на веб-сайте FullCalendar и не являются расширенными свойствами?

Я что-то пропустил или, возможно, существует список стандартных / нестандартных полейчто мне каким-то образом удалось пропустить?


Любые идеи о том, как получить эти поля создатель , будут высоко оценены.

‍‍‍‍‍‍ ‍‍

‍‍‍‍‍‍ ‍‍

Я не понимаю, как здесь может быть полезен какой-либо пример кода, но, как мне недавно сказали" Код почти всегда требуетНастроен на 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

1 Ответ

1 голос
/ 19 марта 2019

Когда в полной документации Календаря говорят

API Календаря Google позволяет указывать Расширенные свойства для ваши события. Расширенные свойства будут доступны как Хэш extendedProperties, который прикреплен к каждому объекту события.

они относятся к дополнительным настраиваемым полям, которые вы, возможно, определили в своих событиях Календаря Google - полям, которые не поддерживаются или не предоставляются API Календаря в стандартной комплектации. Это поля, которые fullCalendar будет копировать как «дополнительные». Это не со ссылкой на «любые поля, которые fullCalendar обычно не считает стандартными».

Теперь, поскольку почти ни одна из структур данных событий, возвращаемых API-интерфейсом «Календарь», не будет отображаться непосредственно в структуру данных, которую fullCalendar требует от вас предоставить для создания допустимого объекта события (см. Список «стандартных» полей fullCalendar в Event Object docs ), мы не можем просто предоставить вывод JSON API-интерфейса Календаря напрямую в fullCalendar и ожидать, что он будет работать и автоматически сопоставлять поля.

Именно поэтому fullCalendar предоставил файл gcal.js в качестве вспомогательной утилиты для подключения к API, извлечения данных о событии и преобразования его в формат, ожидаемый и понятный для fullCalendar. Очевидно, что разработчики сделали выбор в отношении того, какие области они собираются перенести с одного на другое. Поскольку новый объект создается для передачи в fullCalendar, никакого автоматического сопоставления не существует - все зависит от того, что написано в коде. Обычно, если вы предоставляете JSON для fullCalendar direct, он также копирует любые другие поля, которые он находит в объекте, в дополнение к тем, которые он фактически распознает как «стандартные» (т. Е. Стандартные - те, которые он использует для конкретных целей, как объяснено в документация). Но опять же, поскольку код создает новые объекты для fullCalendar, этого также не происходит.

Помимо примечания о "extendedProperties", нет явной документации о том, какие поля копирует код из вывода API в объекты событий, совместимые с fullCalendar. Быстрый эксперимент с использованием console.log($("#calendar").fullCalendar("clientEvents")); на вашей странице покажет, какими свойствами обладают конечные события, но вы также можете посмотреть исходный код. На момент написания статьи последняя версия fullCalendar v3 была 3.10, а исходный код gcal.js для этой версии (доступен для просмотра здесь ).

Код содержит следующий фрагмент кода для преобразования данных 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
    };

В своих вопросах и комментариях вы упомянули, что вас заинтересуют поля creator и description, которые предоставляет API-интерфейс Calendar. Это стандартные поля в GCal (согласно документам о представлении ресурсов ), и поэтому они не будут в коллекции "extendedProperties". Вы также можете видеть, что description уже скопирован в gcal.js, даже если это не поле, которое обычно использует fullCalendar - тем не менее, оно есть, если вы хотите использовать его в своем календаре.

Поэтому все, что вам нужно сделать, чтобы сделать поле creator (или любое другое поле из свойств GCal) доступным в ваших событиях fullCalendar, - это включить его в данные, которые копирует gcal.js. e.g.:

    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
    };

Конечно, если вы включаете gcal.js / gcal.min.js через CDN, вам придется изменить свой код, чтобы вместо него разместить собственную модифицированную версию.


Кроме того, если вы считаете, что для проекта fullCalendar в целом было бы полезно иметь больше полей из GCal, включенных по умолчанию, то, поскольку fullCalendar является проектом сообщества с открытым исходным кодом, вы можете свободно сделатьзапрос функции , чтобы получить изменения, внесенные в утилиту gcal (которая на самом деле является просто дополнительным удобством в качестве слоя между стандартной функциональностью fullCalendar и API Календаря Google), или даже сделать кодовый вклад , содержащийпредлагаемое изменение, для рассмотрения сопровождающими для включения в основной выпуск.В противном случае вы можете продолжить поддерживать свою модифицированную версию gcal.js или даже полностью заменить ее собственной утилитой для взаимодействия с Calendar API.

...