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

dont need renderedSkeleton flag anymore

Adam Shaw 8 лет назад
Родитель
Сommit
f037bee063
6 измененных файлов с 93 добавлено и 82 удалено
  1. 5 0
      src/Calendar.js
  2. 72 8
      src/Calendar.render.js
  3. 3 69
      src/View.js
  4. 1 1
      src/agenda/AgendaView.js
  5. 0 2
      src/component/Component.js
  6. 12 2
      src/component/DateComponent.js

+ 5 - 0
src/Calendar.js

@@ -7,6 +7,9 @@ var Calendar = FC.Calendar = Class.extend(EmitterMixin, {
 	theme: null,
 	loadingLevel: 0, // number of simultaneous loading tasks
 
+	renderQueue: null,
+	batchRenderDepth: 0,
+
 
 	constructor: function(el, overrides) {
 
@@ -22,6 +25,8 @@ var Calendar = FC.Calendar = Class.extend(EmitterMixin, {
 		this.initMomentInternals(); // needs to happen after options hash initialized
 		this.initCurrentDate();
 		this.initEventManager();
+
+		this.renderQueue = this.buildRenderQueue();
 	},
 
 

+ 72 - 8
src/Calendar.render.js

@@ -125,6 +125,69 @@ Calendar.mixin({
 	},
 
 
+	// Render Queue
+	// -----------------------------------------------------------------------------------------------------------------
+
+
+	buildRenderQueue: function() {
+		var _this = this;
+		var renderQueue = new RenderQueue({
+			event: this.opt('eventRenderWait')
+		});
+
+		renderQueue.on('start', function() {
+			var view = _this.view;
+
+			_this.freezeContentHeight();
+			view.addScroll(view.queryScroll()); // TODO: move to Calendar
+		});
+
+		renderQueue.on('stop', function() {
+			var view = _this.view;
+
+			_this.updateViewSize();
+			_this.thawContentHeight();
+			view.popScroll(); // TODO: move to Calendar
+		});
+
+		return renderQueue;
+	},
+
+
+	// TODO: evenutally make Calendar a DateComponent
+	initBatchRenderingForView: function(view) {
+		var _this = this;
+
+		view.on('before:change.batchRender', function() {
+			_this.startBatchRender();
+		});
+
+		view.on('change.batchRender', function() {
+			_this.stopBatchRender();
+		});
+	},
+
+
+	// TODO: evenutally make Calendar a DateComponent
+	destroyBatchRenderingForView: function(view) {
+		view.off('.batchRender');
+	},
+
+
+	startBatchRender: function() {
+		if (!(this.batchRenderDepth++)) {
+			this.renderQueue.pause();
+		}
+	},
+
+
+	stopBatchRender: function() {
+		if (!(--this.batchRenderDepth)) {
+			this.renderQueue.resume();
+		}
+	},
+
+
 
 	// View Rendering
 	// -----------------------------------------------------------------------------------
@@ -134,15 +197,16 @@ Calendar.mixin({
 	// If not given a viewType, keep the current view but render different dates.
 	// Accepts an optional scroll state to restore to.
 	renderView: function(viewType, forcedScroll) {
+		var oldView = this.view;
 
 		this.ignoreWindowResize++;
-
-		var needsClearView = this.view && viewType && this.view.type !== viewType;
+		this.freezeContentHeight(); // wish startBatchRender could do this. troubles with removeElement happening synchronously
+		this.startBatchRender();
 
 		// if viewType is changing, remove the old view's rendering
-		if (needsClearView) {
-			this.freezeContentHeight(); // prevent a scroll jump when view element is removed
+		if (oldView && viewType && oldView.type !== viewType) {
 			this.clearView();
+			this.destroyBatchRenderingForView(oldView); // do AFTER the clear b/c the clear updates lots of props
 		}
 
 		// if viewType changed, or the view was never created, create a fresh view
@@ -151,6 +215,8 @@ Calendar.mixin({
 				this.viewsByType[viewType] ||
 				(this.viewsByType[viewType] = this.instantiateView(viewType));
 
+			this.initBatchRenderingForView(this.view);
+
 			this.view.setElement(
 				$("<div class='fc-view fc-" + viewType + "-view' />").appendTo(this.contentEl)
 			);
@@ -168,10 +234,8 @@ Calendar.mixin({
 			}
 		}
 
-		if (needsClearView) {
-			this.thawContentHeight();
-		}
-
+		this.stopBatchRender();
+		this.thawContentHeight();
 		this.ignoreWindowResize--;
 	},
 

+ 3 - 69
src/View.js

@@ -12,8 +12,6 @@ var View = FC.View = InteractiveDateComponent.extend({
 	viewSpec: null,
 	options: null, // hash containing all options. already merged with view-specific-options
 
-	renderQueue: null,
-	batchRenderDepth: 0,
 	isDatesRendered: false,
 	isEventsRendered: false,
 	isBaseRendered: false, // related to viewRender/viewDestroy triggers
@@ -52,9 +50,6 @@ var View = FC.View = InteractiveDateComponent.extend({
 		this.initHiddenDays();
 		this.eventOrderSpecs = parseFieldSpecs(this.opt('eventOrder'));
 
-		this.renderQueue = this.buildRenderQueue();
-		this.initAutoBatchRender();
-
 		// legacy
 		if (this.initialize) {
 			this.initialize();
@@ -67,54 +62,6 @@ var View = FC.View = InteractiveDateComponent.extend({
 	},
 
 
-	buildRenderQueue: function() {
-		var _this = this;
-		var renderQueue = new RenderQueue({
-			event: this.opt('eventRenderWait')
-		});
-
-		renderQueue.on('start', function() {
-			_this.freezeHeight();
-			_this.addScroll(_this.queryScroll());
-		});
-
-		renderQueue.on('stop', function() {
-			_this.calendar.updateViewSize();
-			_this.thawHeight();
-			_this.popScroll();
-		});
-
-		return renderQueue;
-	},
-
-
-	initAutoBatchRender: function() {
-		var _this = this;
-
-		this.on('before:change', function() {
-			_this.startBatchRender();
-		});
-
-		this.on('change', function() {
-			_this.stopBatchRender();
-		});
-	},
-
-
-	startBatchRender: function() {
-		if (!(this.batchRenderDepth++)) {
-			this.renderQueue.pause();
-		}
-	},
-
-
-	stopBatchRender: function() {
-		if (!(--this.batchRenderDepth)) {
-			this.renderQueue.resume();
-		}
-	},
-
-
 	// Retrieves an option with the given name
 	opt: function(name) {
 		return this.options[name];
@@ -520,20 +467,6 @@ var View = FC.View = InteractiveDateComponent.extend({
 	},
 
 
-	/* Height Freezing
-	------------------------------------------------------------------------------------------------------------------*/
-
-
-	freezeHeight: function() {
-		this.calendar.freezeContentHeight();
-	},
-
-
-	thawHeight: function() {
-		this.calendar.thawContentHeight();
-	},
-
-
 	// Event High-level Rendering
 	// -----------------------------------------------------------------------------------------------------------------
 
@@ -624,12 +557,13 @@ var View = FC.View = InteractiveDateComponent.extend({
 	},
 
 
+	// TODO: move this to Calendar, as well as scroll system
 	applyScreenState: function() {
 
 		// bring to natural height, then freeze again
 		this.calendar.updateViewSize();
-		this.thawHeight();
-		this.freezeHeight();
+		this.calendar.thawContentHeight();
+		this.calendar.freezeContentHeight();
 
 		this.applyQueuedScroll();
 	},

+ 1 - 1
src/agenda/AgendaView.js

@@ -63,7 +63,7 @@ var AgendaView = FC.AgendaView = View.extend({
 	------------------------------------------------------------------------------------------------------------------*/
 
 
-	renderSkeleton: function() { // can kill skeletonRendered?
+	renderSkeleton: function() {
 		var timeGridWrapEl;
 		var timeGridEl;
 

+ 0 - 2
src/component/Component.js

@@ -8,12 +8,10 @@ var Component = Model.extend({
 		this.el = el;
 		this.bindGlobalHandlers();
 		this.renderSkeleton();
-		this.set('renderedSkeleton', true);
 	},
 
 
 	removeElement: function() {
-		this.unset('renderedSkeleton');
 		this.unrenderSkeleton();
 		this.unbindGlobalHandlers();
 

+ 12 - 2
src/component/DateComponent.js

@@ -54,12 +54,22 @@ var DateComponent = Component.extend({
 	requestRender: function(namespace, type, method, args) {
 		var _this = this;
 
-		this._getView().renderQueue.queue(this.uid + ':' + namespace, type, function() {
+		this._getView().calendar.renderQueue.queue(this.uid + ':' + namespace, type, function() {
 			method.apply(_this, args);
 		});
 	},
 
 
+	startBatchRender: function() {
+		this._getView().calendar.startBatchRender();
+	},
+
+
+	stopBatchRender: function() {
+		this._getView().calendar.stopBatchRender();
+	},
+
+
 	updateSize: function(totalHeight, isAuto, isResize) {
 		this.callChildren('updateSize', arguments);
 	},
@@ -713,7 +723,7 @@ DateComponent.watch('businessHoursInChildren', [ 'businessHours' ], function(dep
 });
 
 
-DateComponent.watch('displayingDates', [ 'renderedSkeleton', 'dateProfile' ], function(deps) {
+DateComponent.watch('displayingDates', [ 'dateProfile' ], function(deps) {
 	this.requestRender('date', 'init', this.executeDateRender, [ deps.dateProfile ]);
 }, function() {
 	this.requestRender('date', 'destroy', this.executeDateUnrender);