Adam Shaw 8 лет назад
Родитель
Сommit
50f82c2fc0
2 измененных файлов с 26 добавлено и 42 удалено
  1. 25 42
      src/Calendar.events-api.js
  2. 1 0
      src/common/View.js

+ 25 - 42
src/Calendar.events-api.js

@@ -111,54 +111,40 @@ Calendar.mixin({
 	},
 
 
-	// TODO: improve. can do shortcut if given straight IDs
+	// legacyQuery operates on legacy event instance objects
 	removeEvents: function(legacyQuery) {
 		var eventManager = this.eventManager;
-		var eventIds = this.queryEventIdsViaLegacy(legacyQuery);
+		var eventInstances = eventManager.getEventInstances();
+		var legacyInstances = eventInstances.map(function(eventInstance) {
+			return eventInstance.toLegacy();
+		});
+		var idMap = {};
 		var i;
 
-		eventManager.freeze();
+		legacyInstances = filterLegacyEventInstances(legacyInstances, legacyQuery);
 
-		for (i = 0; i < eventIds.length; i++) {
-			eventManager.removeEventDefsById(eventIds[i]);
+		for (i = 0; i < legacyInstances.length; i++) {
+			idMap[legacyInstances[i].id] = true; // will implicity normalize id to a string
 		}
 
-		eventManager.thaw();
-	},
-
-
-	// is a utility. not meant to be public
-	queryEventIdsViaLegacy: function(legacyQuery) {
-		var eventInstances = this.eventManager.getEventInstances();
-		var matchFunc = buildEventInstanceMatcher(legacyQuery);
-		var i;
-		var eventIdMap = {}; // to remove
+		eventManager.freeze();
 
-		for (i = 0; i < eventInstances.length; i++) {
-			if (matchFunc(eventInstances[i])) {
-				eventIdMap[
-					eventInstances[i].def.id
-				] = true;
-			}
+		for (i in idMap) { // reuse `i` as an "id"
+			eventManager.removeEventDefsById(i);
 		}
 
-		return Object.keys(eventIdMap);
+		eventManager.thaw();
 	},
 
 
+	// legacyQuery operates on legacy event instance objects
 	clientEvents: function(legacyQuery) {
 		var eventInstances = this.eventManager.getEventInstances();
-		var matchFunc = buildEventInstanceMatcher(legacyQuery);
-		var i;
-		var legacyInstances = [];
-
-		for (i = 0; i < eventInstances.length; i++) {
-			if (matchFunc(eventInstances[i])) {
-				legacyInstances.push(eventInstances[i].toLegacy()); // TODO: optimimze re-legacyifying
-			}
-		}
+		var legacyEventInstances = eventInstances.map(function(eventInstance) {
+			return eventInstance.toLegacy();
+		});
 
-		return legacyInstances;
+		return filterLegacyEventInstances(legacyEventInstances, legacyQuery);
 	},
 
 
@@ -194,22 +180,19 @@ Calendar.mixin({
 });
 
 
-function buildEventInstanceMatcher(legacyQuery) {
+function filterLegacyEventInstances(legacyEventInstances, legacyQuery) {
 	if (legacyQuery == null) {
-		return function() {
-			return true;
-		};
+		return legacyEventInstances;
 	}
 	else if ($.isFunction(legacyQuery)) {
-		return function(eventInstance) {
-			return legacyQuery(eventInstance.toLegacy());
-		};
+		return legacyEventInstances.filter(legacyQuery);
 	}
 	else { // an event ID
 		legacyQuery += ''; // normalize to string
 
-		return function(eventInstance) {
-			return eventInstance.def.id === legacyQuery;
-		};
+		return legacyEventInstances.filter(function(legacyEventInstance) {
+			// soft comparison because id not be normalized to string
+			return legacyEventInstance.id == legacyQuery;
+		});
 	}
 }

+ 1 - 0
src/common/View.js

@@ -706,6 +706,7 @@ var View = FC.View = ChronoComponent.extend({
 				!event || // no specified event means should match ALL events
 				event._id === segs[i].event._id || // the exact instance
 				(event.id != null && event.id == segs[i].event.id) // a related instance
+				// ^ do a soft comparison because id not normalized to string
 			) {
 				if (segs[i].el) {
 					func.call(this, segs[i]);