Javascript AngularJS UI日历保存对旧事件的引用

Javascript AngularJS UI日历保存对旧事件的引用,javascript,angularjs,fullcalendar,Javascript,Angularjs,Fullcalendar,我正在AngularJS应用程序中使用FullCalendar(AngularUI日历)。我正在使用EventSources数组传递事件:$scope.EventSources=[$scope.events]由控制器生成和更新$scope.events。我的问题是,每当我更新$scope.events,FullCalendar似乎都会保留对旧事件的引用 在index.html中: <div ui-calendar="uiConfig" ng-model="eventSources" cal

我正在AngularJS应用程序中使用FullCalendar(AngularUI日历)。我正在使用EventSources数组传递事件:
$scope.EventSources=[$scope.events]由控制器生成和更新
$scope.events
。我的问题是,每当我更新
$scope.events
,FullCalendar似乎都会保留对旧事件的引用

在index.html中:

<div ui-calendar="uiConfig" ng-model="eventSources" calendar="myCalendar">

我发现了一个类似的问题(),Studio4Development的答案似乎是最相关的。但是,我认为我通过使用push和splice来维护同一个阵列实例。

我通过跟踪库代码设法弄清楚了为什么会发生这种情况,但却发现我使用bower安装的angular ui日历已经过时。出于某些原因,bower默认安装版本
0.8.1
,而
0.9.0-beta.1
是与fullCalendar v2兼容所必需的。我无法在plnkr中重现此问题,因为plnkr默认提供fullCalendar 1.6,它与旧版本的angular ui calendar兼容

特别是功能

eventsWatcher.onRemoved = function(event) {
      scope.calendar.fullCalendar('removeEvents', function(e) { 
          return e === event; 
      });
};
更新到

eventsWatcher.onRemoved = function(event) {
    scope.calendar.fullCalendar('removeEvents', function(e) { 
        return e._id === event._id;
    });
};
旧函数将向fullCalendar传递一个与任何内容都不匹配的筛选器,因为fullCalendar v2会向每个事件(例如,momentJS对象)添加几个字段

TL;博士


angular ui日历未保存对旧事件的引用。相反,它没有正确地删除事件。更新到最新的beta版解决了这个问题。

编辑的事件不会更新

fullCalendar.js函数
filterLegacyEventInstances()
中存在错误。您可以从以下位置进行修复:

return legacyEventInstance.id == legacyQuery;
致:


并使用它,而不是最小化代码。

对eventSource或events使用函数,然后refetchEvents将work@RichardHermanson是否可以不调用refetchEvents来执行此操作?我很难理解()如何一致地重新渲染,但我的没有。如果添加的事件在当前视图中,则不会。我建议您直接使用fullcalendar,而不是直接使用$scope.events.length=0?有什么需要检查的plunkr/fiddl吗?@MarioLevrero感谢您的评论!我从$scope.events.length=0开始,但这并没有解决问题,但我设法找到了根本原因。事实证明,我安装了一个旧版本的angular ui calendar(bower默认这么做),它不支持fullCalendar v2。
eventsWatcher.onRemoved = function(event) {
    scope.calendar.fullCalendar('removeEvents', function(e) { 
        return e._id === event._id;
    });
};
return legacyEventInstance.id == legacyQuery;
return legacyEventInstance._id == legacyQuery;