Ver Fonte

dont rerender view if already same range

Adam Shaw há 9 anos atrás
pai
commit
6cd0efb77d
5 ficheiros alterados com 77 adições e 80 exclusões
  1. 8 17
      src/Calendar.js
  2. 2 8
      src/agenda/AgendaView.js
  3. 6 12
      src/basic/BasicView.js
  4. 54 34
      src/common/View.js
  5. 7 9
      src/list/ListView.js

+ 8 - 17
src/Calendar.js

@@ -657,25 +657,16 @@ function Calendar_constructor(element, overrides) {
 			// in case the view should render a period of time that is completely hidden
 			// in case the view should render a period of time that is completely hidden
 			date = currentView.massageCurrentDate(date);
 			date = currentView.massageCurrentDate(date);
 
 
-			// render or rerender the view
-			if (
-				!currentView.isDateSet ||
-				!( // NOT within interval range signals an implicit date window change
-					date >= currentView.intervalStart &&
-					date < currentView.intervalEnd
-				)
-			) {
-				if (elementVisible()) {
-
-					if (forcedScroll) {
-						currentView.captureInitialScroll(forcedScroll);
-					}
+			if (elementVisible()) {
+
+				if (forcedScroll) {
+					currentView.captureInitialScroll(forcedScroll);
+				}
 
 
-					currentView.setDate(date);
+				currentView.setDate(date);
 
 
-					if (forcedScroll) {
-						currentView.releaseScroll();
-					}
+				if (forcedScroll) {
+					currentView.releaseScroll();
 				}
 				}
 			}
 			}
 		}
 		}

+ 2 - 8
src/agenda/AgendaView.js

@@ -57,9 +57,8 @@ var AgendaView = FC.AgendaView = View.extend({
 	------------------------------------------------------------------------------------------------------------------*/
 	------------------------------------------------------------------------------------------------------------------*/
 
 
 
 
-	// Sets the display range and computes all necessary dates
-	setRangeFromDate: function(date) {
-		View.prototype.setRangeFromDate.call(this, date); // call the super-method
+	// Renders the view into `this.el`, which has already been assigned
+	renderDates: function() {
 
 
 		this.timeGrid.setRange({
 		this.timeGrid.setRange({
 			start: this.renderStart,
 			start: this.renderStart,
@@ -72,11 +71,6 @@ var AgendaView = FC.AgendaView = View.extend({
 				end: this.renderEnd
 				end: this.renderEnd
 			});
 			});
 		}
 		}
-	},
-
-
-	// Renders the view into `this.el`, which has already been assigned
-	renderDates: function() {
 
 
 		this.el.addClass('fc-agenda-view').html(this.renderSkeletonHtml());
 		this.el.addClass('fc-agenda-view').html(this.renderSkeletonHtml());
 		this.renderHead();
 		this.renderHead();

+ 6 - 12
src/basic/BasicView.js

@@ -41,18 +41,6 @@ var BasicView = FC.BasicView = View.extend({
 	},
 	},
 
 
 
 
-	// Sets the display range and computes all necessary dates
-	setRangeFromDate: function(date) {
-		View.prototype.setRangeFromDate.call(this, date); // call the super-method
-
-		this.dayGrid.breakOnWeeks = /year|month|week/.test(this.intervalUnit); // do before Grid::setRange
-		this.dayGrid.setRange({
-			start: this.renderStart,
-			end: this.renderEnd
-		});
-	},
-
-
 	// Computes the date range that will be rendered.
 	// Computes the date range that will be rendered.
 	computeRenderRange: function(intervalRange) {
 	computeRenderRange: function(intervalRange) {
 		var renderRange = View.prototype.computeRenderRange.call(this, intervalRange);
 		var renderRange = View.prototype.computeRenderRange.call(this, intervalRange);
@@ -76,6 +64,12 @@ var BasicView = FC.BasicView = View.extend({
 	// Renders the view into `this.el`, which should already be assigned
 	// Renders the view into `this.el`, which should already be assigned
 	renderDates: function() {
 	renderDates: function() {
 
 
+		this.dayGrid.breakOnWeeks = /year|month|week/.test(this.intervalUnit); // do before Grid::setRange
+		this.dayGrid.setRange({
+			start: this.renderStart,
+			end: this.renderEnd
+		});
+
 		this.dayNumbersVisible = this.dayGrid.rowCnt > 1; // TODO: make grid responsible
 		this.dayNumbersVisible = this.dayGrid.rowCnt > 1; // TODO: make grid responsible
 		if (this.opt('weekNumbers')) {
 		if (this.opt('weekNumbers')) {
 			if (this.opt('weekNumbersWithinDays')) {
 			if (this.opt('weekNumbersWithinDays')) {

+ 54 - 34
src/common/View.js

@@ -151,6 +151,7 @@ var View = FC.View = Class.extend(EmitterMixin, ListenerMixin, {
 
 
 
 
 	// Updates all internal dates for displaying the given unzoned range.
 	// Updates all internal dates for displaying the given unzoned range.
+	// Will return a boolean about whether there was some sort of change.
 	setRangeFromDate: function(date) {
 	setRangeFromDate: function(date) {
 
 
 		// best place for this?
 		// best place for this?
@@ -167,19 +168,32 @@ var View = FC.View = Class.extend(EmitterMixin, ListenerMixin, {
 		var renderRange = this.computeRenderRange(intervalRange);
 		var renderRange = this.computeRenderRange(intervalRange);
 		var contentRange = this.computeContentRange(renderRange, intervalRange);
 		var contentRange = this.computeContentRange(renderRange, intervalRange);
 
 
-		this.intervalStart = intervalRange.start;
-		this.intervalEnd = intervalRange.end;
-		this.renderStart = renderRange.start;
-		this.renderEnd = renderRange.end;
-		this.contentStart = contentRange.start;
-		this.contentEnd = contentRange.end;
+		if (
+			!this.contentStart ||
+			!this.contentStart.isSame(contentRange.start) ||
+			!this.contentEnd.isSame(contentRange.end)
+		) {
+			// some sort of change
+
+			this.intervalStart = intervalRange.start;
+			this.intervalEnd = intervalRange.end;
+			this.renderStart = renderRange.start;
+			this.renderEnd = renderRange.end;
+			this.contentStart = contentRange.start;
+			this.contentEnd = contentRange.end;
+
+			// DEPRECATED, but we need to keep it updated
+			// TODO: run automated tests with this commented out
+			this.start = this.contentStart;
+			this.end = this.contentEnd;
 
 
-		// DEPRECATED, but we need to keep it updated
-		// TODO: run automated tests with this commented out
-		this.start = this.contentStart;
-		this.end = this.contentEnd;
+			this.updateTitle();
+			this.calendar.updateToolbarButtons();
 
 
-		this.updateTitle();
+			return true;
+		}
+
+		return false;
 	},
 	},
 
 
 
 
@@ -548,41 +562,47 @@ var View = FC.View = Class.extend(EmitterMixin, ListenerMixin, {
 	// if date not specified, uses current
 	// if date not specified, uses current
 	executeDateRender: function(date) {
 	executeDateRender: function(date) {
 		var _this = this;
 		var _this = this;
+		var rangeChanged = false;
 
 
-		// if rendering a new date, reset scroll to initial state (scrollTime)
 		if (date) {
 		if (date) {
-			this.captureInitialScroll();
+			rangeChanged = _this.setRangeFromDate(date);
 		}
 		}
-		else {
-			this.captureScroll(); // a rerender of the current date
-		}
-
-		this.freezeHeight();
 
 
-		return this.executeDateUnrender().then(function() {
+		if (!date || rangeChanged || !_this.isDateRendered) { // should render?
 
 
+			// if rendering a new date, reset scroll to initial state (scrollTime)
 			if (date) {
 			if (date) {
-				_this.setRangeFromDate(date);
+				this.captureInitialScroll();
 			}
 			}
-
-			if (_this.render) {
-				_this.render(); // TODO: deprecate
+			else {
+				this.captureScroll(); // a rerender of the current date
 			}
 			}
 
 
-			_this.renderDates();
-			_this.updateSize();
-			_this.renderBusinessHours(); // might need coordinates, so should go after updateSize()
-			_this.startNowIndicator();
+			this.freezeHeight();
 
 
-			_this.thawHeight();
-			_this.releaseScroll();
+			// potential issue: date-unrendering will happen with the *new* range
+			return this.executeDateUnrender().then(function() {
 
 
-			_this.isDateRendered = true;
-			_this.onDateRender();
-			_this.trigger('dateRender');
+				if (_this.render) {
+					_this.render(); // TODO: deprecate
+				}
 
 
-			_this.calendar.updateToolbarButtons();
-		});
+				_this.renderDates();
+				_this.updateSize();
+				_this.renderBusinessHours(); // might need coordinates, so should go after updateSize()
+				_this.startNowIndicator();
+
+				_this.thawHeight();
+				_this.releaseScroll();
+
+				_this.isDateRendered = true;
+				_this.onDateRender();
+				_this.trigger('dateRender');
+			});
+		}
+		else {
+			return Promise.resolve();
+		}
 	},
 	},
 
 
 
 

+ 7 - 9
src/list/ListView.js

@@ -15,15 +15,6 @@ var ListView = View.extend({
 		});
 		});
 	},
 	},
 
 
-	setRangeFromDate: function(date) {
-		View.prototype.setRangeFromDate.call(this, date); // super
-
-		this.grid.setRange({ // needs to process range-related options
-			start: this.renderStart,
-			end: this.renderEnd
-		});
-	},
-
 	renderSkeleton: function() {
 	renderSkeleton: function() {
 		this.el.addClass(
 		this.el.addClass(
 			'fc-list-view ' +
 			'fc-list-view ' +
@@ -49,6 +40,13 @@ var ListView = View.extend({
 			subtractInnerElHeight(this.el, this.scroller.el); // everything that's NOT the scroller
 			subtractInnerElHeight(this.el, this.scroller.el); // everything that's NOT the scroller
 	},
 	},
 
 
+	renderDates: function() {
+		this.grid.setRange({ // needs to process range-related options
+			start: this.renderStart,
+			end: this.renderEnd
+		});
+	},
+
 	renderEvents: function(events) {
 	renderEvents: function(events) {
 		this.grid.renderEvents(events);
 		this.grid.renderEvents(events);
 	},
 	},