Louis authored on25/08/2018 23:51:28
Showing1 changed files
1 1
new file mode 100644
... ...
@@ -0,0 +1,101 @@
1
+'use strict';
2
+
3
+var $ = require('../vendor/minified').$;
4
+var _ = require('../vendor/minified')._;
5
+
6
+/**
7
+ * Attaches event methods to the context.
8
+ * Call with ClayEvents.call(yourObject, $eventTarget)
9
+ * @param {EventEmitter|M} $eventTarget - An object that will be used as the event
10
+ * target. Must implement EventEmitter
11
+ * @constructor
12
+ */
13
+function ClayEvents($eventTarget) {
14
+  var self = this;
15
+  var _eventProxies = [];
16
+
17
+  /**
18
+   * prefixes events with "|"
19
+   * @param {string} events
20
+   * @returns {string}
21
+   * @private
22
+   */
23
+  function _transformEventNames(events) {
24
+    return events.split(' ').map(function(event) {
25
+      return '|' + event.replace(/^\|/, '');
26
+    }).join(' ');
27
+  }
28
+
29
+  /**
30
+   * @param {function} handler
31
+   * @param {function} proxy
32
+   * @returns {function}
33
+   * @private
34
+   */
35
+  function _registerEventProxy(handler, proxy) {
36
+    var eventProxy = _.find(_eventProxies, function(item) {
37
+      return item.handler === handler ? item : null;
38
+    });
39
+
40
+    if (!eventProxy) {
41
+      eventProxy = { handler: handler, proxy: proxy };
42
+      _eventProxies.push(eventProxy);
43
+    }
44
+    return eventProxy.proxy;
45
+  }
46
+
47
+  /**
48
+   * @param {function} handler
49
+   * @returns {function}
50
+   * @private
51
+   */
52
+  function _getEventProxy(handler) {
53
+    return _.find(_eventProxies, function(item) {
54
+      return item.handler === handler ? item.proxy : null;
55
+    });
56
+  }
57
+
58
+  /**
59
+   * Attach an event listener to the item.
60
+   * @param {string} events - a space separated list of events
61
+   * @param {function} handler
62
+   * @returns {ClayEvents}
63
+   */
64
+  self.on = function(events, handler) {
65
+    var _events = _transformEventNames(events);
66
+    var self = this;
67
+    var _proxy = _registerEventProxy(handler, function() {
68
+      handler.apply(self, arguments);
69
+    });
70
+    $eventTarget.on(_events, _proxy);
71
+    return self;
72
+  };
73
+
74
+  /**
75
+   * Remove the given event handler. NOTE: This will remove the handler from all
76
+   * registered events
77
+   * @param {function} handler
78
+   * @returns {ClayEvents}
79
+   */
80
+  self.off = function(handler) {
81
+    var _proxy = _getEventProxy(handler);
82
+    if (_proxy) {
83
+      $.off(_proxy);
84
+    }
85
+    return self;
86
+  };
87
+
88
+  /**
89
+   * Trigger an event.
90
+   * @param {string} name - a single event name to trigger
91
+   * @param {Object} [eventObj] - an object to pass to the event handler,
92
+   * provided the handler does not have custom arguments.
93
+   * @returns {ClayEvents}
94
+   */
95
+  self.trigger = function(name, eventObj) {
96
+    $eventTarget.trigger(name, eventObj);
97
+    return self;
98
+  };
99
+}
100
+
101
+module.exports = ClayEvents;