Adam Shaw 10 лет назад
Родитель
Сommit
df91c1a1cc
3 измененных файлов с 65 добавлено и 5 удалено
  1. 1 0
      lumbar.json
  2. 10 5
      src/Calendar.js
  3. 54 0
      src/common/Emitter.js

+ 1 - 0
lumbar.json

@@ -18,6 +18,7 @@
         "src/moment-ext.js",
         "src/date-formatting.js",
         "src/common/Class.js",
+        "src/common/Emitter.js",
         "src/common/Popover.js",
         "src/common/CoordMap.js",
         "src/common/DragListener.js",

+ 10 - 5
src/Calendar.js

@@ -252,6 +252,9 @@ var Calendar = fc.Calendar = Class.extend({
 });
 
 
+Calendar.mixin(Emitter);
+
+
 function Calendar_constructor(element, overrides) {
 	var t = this;
 
@@ -885,12 +888,14 @@ function Calendar_constructor(element, overrides) {
 	}
 	
 	
-	function trigger(name, thisObj) {
+	function trigger(name, thisObj) { // overrides the Emitter's trigger method :(
+		var args = Array.prototype.slice.call(arguments, 2);
+
+		thisObj = thisObj || _element;
+		this.triggerWith(name, thisObj, args); // Emitter's method
+
 		if (options[name]) {
-			return options[name].apply(
-				thisObj || _element,
-				Array.prototype.slice.call(arguments, 2)
-			);
+			return options[name].apply(thisObj, args);
 		}
 	}
 

+ 54 - 0
src/common/Emitter.js

@@ -0,0 +1,54 @@
+
+var Emitter = fc.Emitter = Class.extend({ // TODO: make public
+
+	callbackHash: null,
+
+
+	on: function(name, callback) {
+		this.getCallbacks(name).add(callback);
+		return this; // for chaining
+	},
+
+
+	off: function (name, callback) {
+		this.getCallbacks(name).remove(callback);
+		return this; // for chaining
+	},
+
+
+	// TODO: rename to emit?
+	trigger: function (name) { // args...
+		var args = Array.prototype.slice.call(arguments, 1);
+
+		this.triggerWith(name, this, args);
+
+		return this; // for chaining
+	},
+
+
+	// TODO: rename to emitWith?
+	triggerWith: function(name, context, args) {
+		var callbacks = this.getCallbacks(name);
+
+		callbacks.fireWith(context, args);
+
+		return this; // for chaining
+	},
+
+
+	getCallbacks: function(name) {
+		var callbacks;
+
+		if (!this.callbackHash) {
+			this.callbackHash = {};
+		}
+
+		callbacks = this.callbackHash[name];
+		if (!callbacks) {
+			callbacks = this.callbackHash[name] = $.Callbacks();
+		}
+
+		return callbacks;
+	}
+
+});