Оказывается, angular-fullcalendar не привязывает объект календаря к контроллеру. Используя код из ui-fullcalendar (который я не смог получить с моим массивом событий), я обновил angular-fullcalendar.js следующим образом (см. Строки с комментариями).
angular.module('angular-fullcalendar', [])
.constant('CALENDAR_DEFAULTS', { // *** New ***
calendars: {}
})
.value('CALENDAR_DEFAULTS', {
locale: 'en'
})
.directive('fc', ['CALENDAR_DEFAULTS', fcDirectiveFn]);
function fcDirectiveFn(CALENDAR_DEFAULTS) {
return {
restrict: 'A',
scope: {
eventSource: '=ngModel',
options: '=fcOptions'
},
link: function (scope, elm, attrs) { // *** added attrs ***
var calendar;
init();
scope.$watch('eventSource', watchDirective, true);
scope.$watch('options', watchDirective, true);
scope.$on('$destroy', function () {
destroy();
});
function init() {
if (!calendar) {
calendar = $(elm).html('');
}
calendar.fullCalendar(getOptions(scope.options));
if (attrs.calendar) { // *** New ***
CALENDAR_DEFAULTS.calendars[attrs.calendar] = calendar;
}
}
function destroy() {
if (calendar && calendar.fullCalendar) {
calendar.fullCalendar('destroy');
}
if (attrs.calendar) { // *** New ***
calendar = CALENDAR_DEFAULTS.calendars[attrs.calendar] = angular.element(elm).html('');
} else {
calendar = angular.element(elm).html('');
}
}
function getOptions(options) {
const event_source = scope.eventSource;
let isMultiSource = false;
Object.keys(event_source[0]).forEach(key => {
if (key === "events") {
isMultiSource = true;
}
})
if (isMultiSource) {
return angular.extend(CALENDAR_DEFAULTS, {
eventSources: event_source
}, options);
} else {
return angular.extend(CALENDAR_DEFAULTS, {
events: event_source
}, options);
}
}
function watchDirective(newOptions, oldOptions) {
if (newOptions !== oldOptions) {
destroy();
init();
} else if ((newOptions && angular.isUndefined(calendar))) {
init();
}
}
}
};
}
Используя вышеупомянутый JS, включите CALENDAR_DEFAULTS в зависимости вашего контроллера. Обновите ваш полный календарь div, включив в него значение календаря:
<div fc fc-options="calendarOptions" ng-model="eventsArray" calendar="myCalendar"></div>
Теперь вы можете настроить таргетинг на свой календарь и использовать методы fullcalendar!
CALENDAR_DEFAULTS.calendars.myCalendar.fullCalendar('gotoDate', newDate);