فهرست منبع

implicitly batch render actions base on prop set

Adam Shaw 8 سال پیش
والد
کامیت
730bb3203d
2فایلهای تغییر یافته به همراه19 افزوده شده و 2 حذف شده
  1. 6 2
      src/common/Model.js
  2. 13 0
      src/common/View.js

+ 6 - 2
src/common/Model.js

@@ -49,17 +49,21 @@ var Model = Class.extend(EmitterMixin, ListenerMixin, {
 			typeof val === 'object' ||
 			val !== this._props[name]
 		) {
+			this.trigger('before:change', name, val);
 			this.trigger('before:change:' + name, val);
 			this._props[name] = val;
 			this.trigger('change:' + name, val);
+			this.trigger('change', name, val);
 		}
 	},
 
 	unset: function(name) {
 		if (this.has(name)) {
-			this.trigger('before:change:' + name, undefined);
+			this.trigger('before:change', name); // val=undefined
+			this.trigger('before:change:' + name); // val=undefined
 			delete this._props[name];
-			this.trigger('change:' + name, undefined);
+			this.trigger('change:' + name); // val=undefined
+			this.trigger('change', name); // val=undefined
 		}
 	},
 

+ 13 - 0
src/common/View.js

@@ -74,6 +74,7 @@ var View = FC.View = Model.extend({
 	buildRenderQueue: function() {
 		var _this = this;
 		var renderQueue = new TaskQueue();
+		var changeDepth = 0;
 
 		renderQueue.on('start', function() {
 			_this.freezeHeight();
@@ -85,6 +86,18 @@ var View = FC.View = Model.extend({
 			_this.popScroll();
 		});
 
+		this.on('before:change', function(name) {
+			if (!(changeDepth++)) {
+				renderQueue.pause();
+			}
+		});
+
+		this.on('change', function(name) {
+			if (!(--changeDepth)) {
+				renderQueue.resume();
+			}
+		});
+
 		return renderQueue;
 	},