Cache event types and changed method names

This commit is contained in:
Tom Payne
2012-07-10 17:22:50 +02:00
committed by Tom Payne
parent 6610496e56
commit fc585de50f
2 changed files with 65 additions and 3 deletions

View File

@@ -67,6 +67,24 @@ ol.Object.create = function(arg) {
};
/**
* @private
* @type {Object.<string, string>}
*/
ol.Object.changedEventTypeCache_ = {};
/**
* @param {string} key Key.
* @private
* @return {string} Changed name.
*/
ol.Object.getChangedEventType_ = function(key) {
return ol.Object.changedEventTypeCache_[key] ||
(ol.Object.changedEventTypeCache_[key] = key.toLowerCase() + '_changed');
};
/**
* @private
* @type {Object.<string, string>}
@@ -85,6 +103,24 @@ ol.Object.getGetterName_ = function(key) {
};
/**
* @private
* @type {Object.<string, string>}
*/
ol.Object.changedMethodNameCache_ = {};
/**
* @param {string} key String.
* @private
* @return {string} Changed method name.
*/
ol.Object.getChangedMethodName_ = function(key) {
return ol.Object.changedMethodNameCache_[key] ||
(ol.Object.changedMethodNameCache_[key] = key + '_changed');
};
/**
* @private
* @type {Object.<string, string>}
@@ -133,7 +169,7 @@ ol.Object.prototype.bindTo =
function(key, target, opt_targetKey, opt_noNotify) {
var targetKey = goog.isDef(opt_targetKey) ? opt_targetKey : key;
this.unbind(key);
var eventType = targetKey.toLowerCase() + '_changed';
var eventType = ol.Object.getChangedEventType_(targetKey);
var listeners = ol.Object.getListeners(this);
listeners[key] = goog.events.listen(target, eventType, function() {
this.notifyInternal_(key);
@@ -197,13 +233,13 @@ ol.Object.prototype.notify = function(key) {
* @private
*/
ol.Object.prototype.notifyInternal_ = function(key) {
var changedMethodName = key + '_changed';
var changedMethodName = ol.Object.getChangedMethodName_(key);
if (this[changedMethodName]) {
this[changedMethodName]();
} else {
this.changed(key);
}
var eventType = key.toLowerCase() + '_changed';
var eventType = ol.Object.getChangedEventType_(key);
this.dispatchEvent(eventType);
};

View File

@@ -454,3 +454,29 @@ function testCreateWithOptions() {
var obj = new ol.Object({k: 1});
assertEquals(1, obj.get('k'));
}
function testEventTypeCaseSensitivity() {
var obj = new ol.Object();
var lowercaseChangedMethodCalled = false;
obj.k_changed = function() {
lowercaseChangedMethodCalled = true;
};
var uppercaseChangedMethodCalled = false;
obj.K_changed = function() {
uppercaseChangedMethodCalled = true;
};
var lowercaseEventDispatched = false;
goog.events.listen(obj, 'k_changed', function() {
lowercaseEventDispatched = true;
});
var uppercaseEventDispatched = false;
goog.events.listen(obj, 'K_changed', function() {
uppercaseEventDispatched = true;
});
obj.set('K', 1);
assertTrue(lowercaseEventDispatched);
assertFalse(uppercaseEventDispatched);
assertFalse(lowercaseChangedMethodCalled);
assertTrue(uppercaseChangedMethodCalled);
}