فهرست منبع

removeEvents call with an array source doesn't persist (issue 2187)

Adam Shaw 11 سال پیش
والد
کامیت
47ae8b3b6e
1فایلهای تغییر یافته به همراه42 افزوده شده و 23 حذف شده
  1. 42 23
      src/EventManager.js

+ 42 - 23
src/EventManager.js

@@ -82,11 +82,21 @@ function EventManager(options) { // assumed to be a calendar
 	
 	function fetchEventSource(source, fetchID) {
 		_fetchEventSource(source, function(events) {
+			var isArraySource = $.isArray(source.events);
+			var i;
+			var event;
+
 			if (fetchID == currentFetchID) {
 
 				if (events) {
-					for (var i=0; i<events.length; i++) {
-						var event = buildEvent(events[i], source);
+					for (i=0; i<events.length; i++) {
+						event = events[i];
+
+						// event array sources have already been convert to Event Objects
+						if (!isArraySource) {
+							event = buildEvent(event, source);
+						}
+
 						if (event) {
 							cache.push(event);
 						}
@@ -247,6 +257,14 @@ function EventManager(options) { // assumed to be a calendar
 		}
 
 		if (source) {
+
+			// for array sources, we convert to standard Event Objects up front
+			if ($.isArray(source.events)) {
+				source.events = $.map(source.events, function(eventInput) {
+					return buildEvent(eventInput, source);
+				});
+			}
+
 			for (i=0; i<normalizers.length; i++) {
 				normalizers[i].call(t, source);
 			}
@@ -345,30 +363,31 @@ function EventManager(options) { // assumed to be a calendar
 	
 	
 	function removeEvents(filter) {
+		var eventID;
 		var i;
-		if (filter == null) { // null or undefined. remove all
-			cache = [];
-			// clear all array sources
-			for (i=0; i<sources.length; i++) {
-				if ($.isArray(sources[i].events)) {
-					sources[i].events = [];
-				}
-			}
-		}else{
-			if (!$.isFunction(filter)) { // an event ID
-				var id = filter + '';
-				filter = function(e) {
-					return e._id == id;
-				};
-			}
-			cache = $.grep(cache, filter, true);
-			// remove events from array sources
-			for (i=0; i<sources.length; i++) {
-				if ($.isArray(sources[i].events)) {
-					sources[i].events = $.grep(sources[i].events, filter, true);
-				}
+
+		if (filter == null) { // null or undefined. remove all events
+			filter = function() { return true; }; // will always match
+		}
+		else if (!$.isFunction(filter)) { // an event ID
+			eventID = filter + '';
+			filter = function(event) {
+				return event._id == eventID;
+			};
+		}
+
+		// Purge event(s) from our local cache
+		cache = $.grep(cache, filter, true); // inverse=true
+
+		// Remove events from array sources.
+		// This works because they have been converted to official Event Objects up front.
+		// (and as a result, event._id has been calculated).
+		for (i=0; i<sources.length; i++) {
+			if ($.isArray(sources[i].events)) {
+				sources[i].events = $.grep(sources[i].events, filter, true);
 			}
 		}
+
 		reportEvents(cache);
 	}