ソースを参照

removeElement does mesh with renderqueue. fix

Adam Shaw 8 年 前
コミット
21171792a1
2 ファイル変更23 行追加17 行削除
  1. 18 16
      src/Calendar.render.js
  2. 5 1
      src/View.js

+ 18 - 16
src/Calendar.render.js

@@ -4,8 +4,8 @@ Calendar.mixin({
 	el: null,
 	contentEl: null,
 	suggestedViewHeight: null,
+	ignoreUpdateViewSize: 0,
 	windowResizeProxy: null,
-	ignoreWindowResize: 0,
 
 
 	render: function() {
@@ -146,9 +146,11 @@ Calendar.mixin({
 		renderQueue.on('stop', function() {
 			var view = _this.view;
 
-			_this.updateViewSize();
+			if (_this.updateViewSize()) { // success?
+				view.popScroll(); // TODO: move to Calendar
+			}
+
 			_this.thawContentHeight();
-			view.popScroll(); // TODO: move to Calendar
 		});
 
 		return renderQueue;
@@ -200,9 +202,8 @@ Calendar.mixin({
 	renderView: function(viewType, forcedScroll) {
 		var oldView = this.view;
 
-		this.ignoreWindowResize++;
-		this.freezeContentHeight(); // wish startBatchRender could do this. troubles with removeElement happening synchronously
-		this.startBatchRender();
+		this.freezeContentHeight();
+		this.ignoreUpdateViewSize++;
 
 		// if viewType is changing, remove the old view's rendering
 		if (oldView && viewType && oldView.type !== viewType) {
@@ -235,9 +236,10 @@ Calendar.mixin({
 			}
 		}
 
-		this.stopBatchRender();
+		this.ignoreUpdateViewSize--;
+		this.updateViewSize();
 		this.thawContentHeight();
-		this.ignoreWindowResize--;
+		this.view.popScroll();
 	},
 
 
@@ -254,8 +256,8 @@ Calendar.mixin({
 	// Maintains the same scroll state.
 	// TODO: maintain any other user-manipulated state.
 	reinitView: function() {
-		this.ignoreWindowResize++;
 		this.freezeContentHeight();
+		this.ignoreUpdateViewSize++;
 
 		var viewType = this.view.type;
 		var scrollState = this.view.queryScroll();
@@ -263,8 +265,9 @@ Calendar.mixin({
 		this.calcSize();
 		this.renderView(viewType, scrollState);
 
+		this.ignoreUpdateViewSize--;
+		this.updateViewSize();
 		this.thawContentHeight();
-		this.ignoreWindowResize--;
 	},
 
 
@@ -285,18 +288,18 @@ Calendar.mixin({
 	},
 
 
-	updateViewSize: function(isResize) {
+	updateViewSize: function(isResize, force) {
 		var view = this.view;
 		var scroll;
 
-		if (this.elementVisible()) {
+		if ((force || !this.ignoreUpdateViewSize) && this.elementVisible()) {
 
 			if (isResize) {
 				this._calcSize();
 				scroll = view.queryScroll();
 			}
 
-			this.ignoreWindowResize++;
+			this.ignoreUpdateViewSize++;
 
 			view.updateSize(
 				this.getSuggestedViewHeight(),
@@ -304,7 +307,7 @@ Calendar.mixin({
 				isResize
 			);
 
-			this.ignoreWindowResize--;
+			this.ignoreUpdateViewSize--;
 
 			if (isResize) {
 				view.applyScroll(scroll);
@@ -352,11 +355,10 @@ Calendar.mixin({
 
 	windowResize: function(ev) {
 		if (
-			!this.ignoreWindowResize &&
 			ev.target === window && // so we don't process jqui "resize" events that have bubbled up
 			this.view.isDatesRendered
 		) {
-			if (this.updateViewSize(true)) { // isResize=true
+			if (this.updateViewSize(true)) { // isResize=true, returns true on success
 				this.publiclyTrigger('windowResize', [ this.view ]);
 			}
 		}

+ 5 - 1
src/View.js

@@ -568,8 +568,12 @@ var View = FC.View = InteractiveDateComponent.extend({
 	// TODO: move this to Calendar, as well as scroll system
 	applyScreenState: function() {
 
+		this.calendar.updateViewSize(
+			false, // isResize
+			true // force
+		);
+
 		// bring to natural height, then freeze again
-		this.calendar.updateViewSize();
 		this.calendar.thawContentHeight();
 		this.calendar.freezeContentHeight();