Просмотр исходного кода

better way of firing eventAfterAllRender

Adam Shaw 8 лет назад
Родитель
Сommit
695ec140cf

+ 35 - 6
src/View.js

@@ -706,10 +706,13 @@ var View = FC.View = InteractiveDateComponent.extend({
 
 	triggerEventsRendered: function() {
 		var _this = this;
+		var renderedEventSegs = this.renderedEventSegs;
+
+		this.renderedEventSegs = null;
 
 		// an optimization, because getEventLegacy is expensive
 		if (this.hasPublicHandlers('eventAfterRender')) {
-			this.renderedEventSegs.forEach(function(seg) {
+			renderedEventSegs.forEach(function(seg) {
 				var legacy;
 
 				if (seg.el) { // necessary?
@@ -723,12 +726,14 @@ var View = FC.View = InteractiveDateComponent.extend({
 			});
 		}
 
-		this.renderedEventSegs = null;
+		if (this.needsEventAfterAllRender) {
+			delete this.needsEventAfterAllRender;
 
-		this.publiclyTrigger('eventAfterAllRender', {
-			context: this,
-			args: [ this ]
-		});
+			this.publiclyTrigger('eventAfterAllRender', {
+				context: this,
+				args: [ this ]
+			});
+		}
 	},
 
 
@@ -774,6 +779,30 @@ View.watch('displayingBase', [ 'dateProfile' ], function(deps) {
 });
 
 
+View.watch('reportingEventsResolved', [ 'eventDataSource' ], function(deps) {
+	var eventDataSource = deps.eventDataSource;
+
+	if (eventDataSource.isResolved) {
+		this.reportEventsResolved();
+	}
+
+	this.listenTo(eventDataSource, 'resolved', this.reportEventsResolved);
+}, function(deps) {
+	this.stopListeningTo(deps.eventDataSource, 'resolved', this.reportEventsResolved);
+});
+
+
+View.prototype.reportEventsResolved = function() {
+	this.set('eventsResolvedId', Math.random());
+};
+
+
+View.watch('displayingBaseEvents', [ 'displayingBase', 'eventsResolvedId' ], function() {
+	this.needsEventAfterAllRender = true;
+	this.onAfterEventsRender([]);
+});
+
+
 // responsible for populating data that DateComponent relies on
 
 

+ 3 - 3
src/component/DateComponent.js

@@ -102,11 +102,11 @@ var DateComponent = FC.DateComponent = Component.extend({
 	whenSizeUpdated: function(func) {
 		var renderQueue = this._getView().calendar.renderQueue;
 
-		if (!renderQueue.isRunning && !renderQueue.isPaused) {
+		if (renderQueue.getIsIdle()) {
 			func.call(this);
 		}
 		else {
-			renderQueue.one('stop', func.bind(this));
+			renderQueue.one('idle', func.bind(this));
 		}
 	},
 
@@ -292,7 +292,7 @@ var DateComponent = FC.DateComponent = Component.extend({
 
 
 	startDisplayingEvents: function(eventDataSource) {
-		if (eventDataSource.isPopulated) {
+		if (eventDataSource.instanceRepo.cnt) {
 			this.requestEventRender(eventDataSource.instanceRepo);
 		}
 

+ 7 - 8
src/models/EventInstanceDataSource.js

@@ -4,7 +4,7 @@ var EventInstanceDataSource = Class.extend(EmitterMixin, ListenerMixin, {
 	instanceRepo: null,
 	freezeDepth: 0,
 	outboundChangeset: null,
-	isPopulated: false, // can remove after we remove eventAfterAllRender
+	isResolved: false, // for eventAfterAllRender
 
 
 	constructor: function() {
@@ -13,11 +13,12 @@ var EventInstanceDataSource = Class.extend(EmitterMixin, ListenerMixin, {
 
 
 	tryReset: function() {
-		if (this.isPopulated && this.canTrigger()) {
+		if (this.isResolved && this.canTrigger()) {
 			this.triggerChangeset(new EventInstanceChangeset(
 				this.instanceRepo, // removals
 				this.instanceRepo // additions
 			));
+			this.trigger('resolved');
 		}
 	},
 
@@ -52,7 +53,6 @@ var EventInstanceDataSource = Class.extend(EmitterMixin, ListenerMixin, {
 		var outboundChangeset = this.outboundChangeset;
 
 		if (this.canTrigger()) {
-			this.isPopulated = true; // event if empty result, consider populated
 
 			if (outboundChangeset) {
 				outboundChangeset.applyToRepo(this.instanceRepo); // finally internally record
@@ -60,11 +60,10 @@ var EventInstanceDataSource = Class.extend(EmitterMixin, ListenerMixin, {
 				this.outboundChangeset = null;
 				this.triggerChangeset(outboundChangeset);
 			}
-			else {
-				// hack for eventAfterAllRender
-				// also for DateComponents to know an empy, but populated, state
-				this.triggerChangeset(new EventInstanceChangeset());
-			}
+
+			// for eventAfterAllRender
+			this.isResolved = true;
+			this.trigger('resolved');
 		}
 	},
 

+ 3 - 15
src/models/EventInstanceDataSourceSplitter.js

@@ -3,7 +3,6 @@ var EventInstanceDataSourceSplitter = FC.EventInstanceDataSourceSplitter = Class
 
 	keysFunc: null,
 	repoHash: null,
-	isPopulated: false, // hack for eventAfterAllRender
 
 
 	constructor: function(keysFunc) {
@@ -19,20 +18,11 @@ var EventInstanceDataSourceSplitter = FC.EventInstanceDataSourceSplitter = Class
 		if (initialRepo) {
 			subDataSource.addChangeset(new EventInstanceChangeset(null, initialRepo));
 		}
-		else if (this.isPopulated) {
-			subDataSource.isPopulated = true;
-		}
 
 		subDataSource.listenTo(this, 'receive:' + key, function(changeset) {
 			subDataSource.addChangeset(changeset);
 		});
 
-		subDataSource.listenTo(this, 'after:receive', function() {
-			if (!subDataSource.isPopulated) {
-				subDataSource.addChangeset(new EventInstanceChangeset());
-			}
-		});
-
 		return subDataSource;
 	},
 
@@ -43,7 +33,8 @@ var EventInstanceDataSourceSplitter = FC.EventInstanceDataSourceSplitter = Class
 
 
 	addSource: function(dataSource) {
-		if (dataSource.isPopulated) {
+
+		if (dataSource.instanceRepo.cnt) {
 			this.processChangeset(new EventInstanceChangeset(null, dataSource.instanceRepo)); // add all
 		}
 
@@ -54,7 +45,7 @@ var EventInstanceDataSourceSplitter = FC.EventInstanceDataSourceSplitter = Class
 	removeSource: function(dataSource) {
 		this.stopListeningTo(dataSource);
 
-		if (dataSource.isPopulated) {
+		if (dataSource.instanceRepo.cnt) {
 			this.processChangeset(new EventInstanceChangeset(dataSource.instanceRepo)); // remove all
 		}
 	},
@@ -85,9 +76,6 @@ var EventInstanceDataSourceSplitter = FC.EventInstanceDataSourceSplitter = Class
 
 			this.trigger('receive:' + key, changesetsByKey[key]);
 		}
-
-		this.trigger('after:receive');
-		this.isPopulated = true;
 	},