drop ClayEvents.one since it is a pain to work with and add tests for ClayEvents

This commit is contained in:
Keegan
2016-02-09 17:19:41 -08:00
parent 80982c8e6d
commit c0f6fb770c
6 changed files with 265 additions and 39 deletions
+11
View File
@@ -193,7 +193,18 @@ ClayConfig.registerComponent = function(component) {
var _component = _.copyObj(component);
if (typeof _component.manipulator === 'string') {
_component.manipulator = manipulators[component.manipulator];
if (!_component.manipulator) {
throw new Error('The manipulator: ' + component.manipulator +
' does not exist in the built-in manipulators.');
}
}
if (typeof _component.manipulator.set !== 'function' ||
typeof _component.manipulator.get !== 'function') {
throw new Error('The manipulator must have both a `get` and `set` method');
}
componentStore[_component.name] = _component;
};
+39 -33
View File
@@ -1,7 +1,7 @@
'use strict';
var $ = require('../vendor/minified/minified').$;
var _ = require('../vendor/minified/minified')._;
/**
* Attaches event methods to the context.
* Call with ClayEvents.call(yourObject, $eventTarget)
@@ -11,48 +11,51 @@ var $ = require('../vendor/minified/minified').$;
*/
function ClayEvents($eventTarget) {
var self = this;
var _eventProxies = {};
var _eventProxies = [];
/**
* Attach an event listener to the item. This proxies minified.js' on.
* If you are using a native event like "change", consider using "|change" instead
* as this will allow the native events to still work
* @see {@link http://minifiedjs.com/api/on.html|.on()}
* prefixes events with "|"
* @param {string} events
* @param {function} handler
* @returns {object}
* @returns {string}
* @private
*/
self.on = function(events, handler) {
var _events = events.split(' ').map(function(event) {
var _transformEventNames = function(events) {
return events.split(' ').map(function(event) {
return '|' + event.replace(/^\|/, '');
}).join(' ');
var self = this;
_eventProxies[handler] = function() {
handler.apply(self, arguments);
};
$eventTarget.on(_events, _eventProxies[handler]);
return self;
};
var _registerEventProxy = function(handler, proxy) {
var eventProxy = _.find(_eventProxies, function(item) {
return item.handler === handler ? item : null;
});
if (!eventProxy) {
eventProxy = { handler: handler, proxy: proxy };
_eventProxies.push(eventProxy);
}
return eventProxy.proxy;
};
var _getEventProxy = function(handler) {
return _.find(_eventProxies, function(item) {
return item.handler === handler ? item.proxy : null;
});
};
/**
* Attach an event listener to the item. This proxies minified.js' one.
* If you are using a native event like "change", consider using "|change" instead
* as this will allow the native events to still work
* @see {@link http://minifiedjs.com/api/one.html|.one()}
* @param {string} events
* Attach an event listener to the item.
* @param {string} events - a space separated list of events
* @param {function} handler
* @returns {object}
* @returns {ClayEvents}
*/
self.one = function(events, handler) {
var _events = events.split(' ').map(function(event) {
return '|' + event.replace(/^\|/, '');
}).join(' ');
self.on = function(events, handler) {
var _events = _transformEventNames(events);
var self = this;
_eventProxies[handler] = function(event) {
var _proxy = _registerEventProxy(handler, function() {
handler.apply(self, arguments);
$.off(_eventProxies[handler]);
};
$eventTarget.on(_events, _eventProxies[handler]);
});
$eventTarget.on(_events, _proxy);
return self;
};
@@ -60,10 +63,13 @@ function ClayEvents($eventTarget) {
* Remove the given event handler.
* @see {@link http://minifiedjs.com/api/off.html|$.off()}
* @param {function} handler
* @returns {object}
* @returns {ClayEvents}
*/
self.off = function(handler) {
$.off(_eventProxies[handler]);
var _proxy = _getEventProxy(handler);
if (_proxy) {
$.off(_proxy);
}
return self;
};
@@ -73,7 +79,7 @@ function ClayEvents($eventTarget) {
* @param {object} [eventObj] - an object to pass to the event handler,
* provided the handler does not have custom arguments.
* @see {@link http://minifiedjs.com/api/trigger.html|.trigger()}
* @returns {object}
* @returns {ClayEvents}
*/
self.trigger = function(name, eventObj) {
$eventTarget.trigger(name, eventObj);