瀏覽代碼

aggregate messages. new approach to before:all stuff

Adam Shaw 8 年之前
父節點
當前提交
f63433c8c9
共有 7 個文件被更改,包括 66 次插入50 次删除
  1. 1 0
      src.json
  2. 1 35
      src/Calendar.render.js
  3. 16 4
      src/View.js
  4. 33 0
      src/common/MessageAggregator.js
  5. 0 2
      src/common/RenderQueue.js
  6. 0 7
      src/common/TaskQueue.js
  7. 15 2
      src/component/DateComponent.js

+ 1 - 0
src.json

@@ -22,6 +22,7 @@
     "common/MouseFollower.js",
     "common/Scroller.js",
     "common/Iterator.js",
+    "common/MessageAggregator.js",
     "component/interactions/Interaction.js",
     "component/interactions/DateClicking.js",
     "component/interactions/DateSelecting.js",

+ 1 - 35
src/Calendar.render.js

@@ -132,60 +132,26 @@ Calendar.mixin({
 
 	buildRenderQueue: function() {
 		var _this = this;
-
-		var inits = [];
-		var initMap = {};
-		var destroys = [];
-		var destroyMap = {};
-
 		var renderQueue = new RenderQueue({
 			event: this.opt('eventRenderWait')
 		});
 
-		renderQueue.on('push', function(task) {
-			if (task.actionType === 'init') {
-				if (!initMap[task.namespace]) {
-					inits.push(task.namespace);
-					initMap[task.namespace] = true;
-				}
-			}
-			else if (task.actionType === 'destroy') {
-				if (!destroyMap[task.namespace]) {
-					destroys.push(task.namespace);
-					destroyMap[task.namespace] = true;
-				}
-			}
-		});
-
 		renderQueue.on('start', function() {
 			var view = _this.view;
-			var i;
-
-			for (i = 0; i < destroys.length; i++) {
-				_this.trigger('beforeRenderDestroy:' + destroys[i]);
-			}
-			destroys = [];
-			destroyMap = {};
 
 			_this.freezeContentHeight();
+
 			view.addScroll(view.queryScroll()); // TODO: move to Calendar
 		});
 
 		renderQueue.on('stop', function() {
 			var view = _this.view;
-			var i;
 
 			if (_this.updateViewSize()) { // success?
 				view.popScroll(); // TODO: move to Calendar
 			}
 
 			_this.thawContentHeight();
-
-			for (i = 0; i < inits.length; i++) {
-				_this.trigger('afterRenderInit:' + inits[i]);
-			}
-			inits = [];
-			initMap = {};
 		});
 
 		return renderQueue;

+ 16 - 4
src/View.js

@@ -52,6 +52,11 @@ var View = FC.View = InteractiveDateComponent.extend({
 		if (this.initialize) {
 			this.initialize();
 		}
+
+		this.on('all:dateRender', this.onAllDateRender);
+		this.on('before:all:dateUnrender', this.onBeforeAllDateUnrender);
+		this.on('all:eventRender', this.onAllEventRender);
+		this.on('before:all:eventUnrender', this.onBeforeAllEventUnrender);
 	},
 
 
@@ -231,6 +236,7 @@ var View = FC.View = InteractiveDateComponent.extend({
 			this.addScroll(this.computeInitialDateScroll());
 		}
 
+		this.trigger('dateRender');
 		this.isDatesRendered = true;
 	},
 
@@ -239,6 +245,8 @@ var View = FC.View = InteractiveDateComponent.extend({
 
 		this.unselect();
 		this.stopNowIndicator();
+
+		this.trigger('before:dateUnrender');
 		this.unrenderDates();
 
 		if (this.destroy) {
@@ -253,7 +261,7 @@ var View = FC.View = InteractiveDateComponent.extend({
 	// -----------------------------------------------------------------------------------------------------------------
 
 
-	onAfterBaseRender: function() {
+	onAllDateRender: function() {
 		this.applyScreenState(); // TODO: only call if hasHandlers
 		this.publiclyTrigger('viewRender', {
 			context: this,
@@ -262,7 +270,7 @@ var View = FC.View = InteractiveDateComponent.extend({
 	},
 
 
-	onBeforeBaseUnrender: function() {
+	onBeforeAllDateUnrender: function() {
 		this.applyScreenState(); // TODO: only call if hasHandlers
 		this.publiclyTrigger('viewDestroy', {
 			context: this,
@@ -460,10 +468,14 @@ var View = FC.View = InteractiveDateComponent.extend({
 		else {
 			this.renderEventsPayload(eventsPayload);
 		}
+
+		this.trigger('eventRender');
 	},
 
 
 	executeEventsUnrender: function() {
+		this.trigger('before:eventUnrender');
+
 		if (this.destroyEvents) {
 			this.destroyEvents(); // TODO: deprecate
 		}
@@ -485,7 +497,7 @@ var View = FC.View = InteractiveDateComponent.extend({
 
 
 	// Signals that all events have been rendered
-	onAfterEventsRender: function() {
+	onAllEventRender: function() {
 		var _this = this;
 		var hasSingleHandlers = this.hasPublicHandlers('eventAfterRender');
 
@@ -516,7 +528,7 @@ var View = FC.View = InteractiveDateComponent.extend({
 
 
 	// Signals that all event elements are about to be removed
-	onBeforeEventsUnrender: function() {
+	onBeforeAllEventUnrender: function() {
 		var _this = this;
 
 		if (this.hasPublicHandlers('eventDestroy')) {

+ 33 - 0
src/common/MessageAggregator.js

@@ -0,0 +1,33 @@
+
+function buildMessageAggregator(parent, initName, destroyName) {
+	var childCnt = 0;
+	var reportCnt = 0;
+
+
+	parent.on(initName, up);
+	parent.on('before:' + destroyName, down);
+
+
+	function addChild(child) {
+		child.on('all:' + initName, up);
+		child.on('before:all:' + destroyName, down);
+		childCnt++;
+	}
+
+
+	function up() {
+		if (++reportCnt === childCnt + 1) {
+			parent.trigger('all:' + initName);
+		}
+	}
+
+
+	function down() {
+		if (--reportCnt === childCnt) {
+			parent.trigger('before:all:' + destroyName);
+		}
+	}
+
+
+	return { addChild: addChild };
+}

+ 0 - 2
src/common/RenderQueue.js

@@ -43,8 +43,6 @@ var RenderQueue = TaskQueue.extend({
 
 		if (this.compoundTask(task)) { // appended to queue?
 
-			this.trigger('push', task);
-
 			if (!this.waitNamespace && waitMs != null) {
 				this.startWait(namespace, waitMs);
 			}

+ 0 - 7
src/common/TaskQueue.js

@@ -12,14 +12,7 @@ var TaskQueue = Class.extend(EmitterMixin, {
 
 
 	queue: function(/* taskFunc, taskFunc... */) {
-		var i;
-
 		this.q.push.apply(this.q, arguments); // append
-
-		for (i = 0; i < arguments.length; i++) {
-			this.trigger('push', arguments[i]);
-		}
-
 		this.tryStart();
 	},
 

+ 15 - 2
src/component/DateComponent.js

@@ -18,6 +18,9 @@ var DateComponent = Component.extend({
 
 	hitsNeededDepth: 0, // necessary because multiple callers might need the same hits
 
+	dateMessageAggregator: null,
+	eventMessageAggregator: null,
+
 
 	constructor: function() {
 		Component.call(this);
@@ -43,11 +46,17 @@ var DateComponent = Component.extend({
 		if (this.businessHourRendererClass && this.fillRenderer) {
 			this.businessHourRenderer = new this.businessHourRendererClass(this, this.fillRenderer);
 		}
+
+		this.dateMessageAggregator = buildMessageAggregator(this, 'dateRender', 'dateUnrender');
+		this.eventMessageAggregator = buildMessageAggregator(this, 'eventRender', 'eventUnrender');
 	},
 
 
-	addChild: function(chronoComponent) {
-		this.children.push(chronoComponent);
+	addChild: function(child) {
+		this.children.push(child);
+
+		this.dateMessageAggregator.addChild(child);
+		this.eventMessageAggregator.addChild(child);
 	},
 
 
@@ -124,10 +133,12 @@ var DateComponent = Component.extend({
 
 	executeDateRender: function(dateProfile, skipScroll) { // wrapper
 		this.renderDates(dateProfile);
+		this.trigger('dateRender');
 	},
 
 
 	executeDateUnrender: function() { // wrapper
+		this.trigger('before:dateUnrender');
 		this.unrenderDates();
 	},
 
@@ -285,10 +296,12 @@ var DateComponent = Component.extend({
 
 	executeEventsRender: function(eventsPayload) { // wrapper
 		this.renderEventsPayload(eventsPayload);
+		this.trigger('eventRender');
 	},
 
 
 	executeEventsUnrender: function() { // wrapper
+		this.trigger('before:eventUnrender');
 		this.unrenderEvents();
 	},