106 lines
3.2 KiB
JavaScript
106 lines
3.2 KiB
JavaScript
/**
|
|
* @private
|
|
*/
|
|
Ext.define('Ext.Evented', {
|
|
|
|
alternateClassName: 'Ext.EventedBase',
|
|
|
|
mixins: ['Ext.mixin.Observable'],
|
|
|
|
statics: {
|
|
generateSetter: function(nameMap) {
|
|
var internalName = nameMap.internal,
|
|
applyName = nameMap.apply,
|
|
changeEventName = nameMap.changeEvent,
|
|
doSetName = nameMap.doSet;
|
|
|
|
return function(value) {
|
|
var initialized = this.initialized,
|
|
oldValue = this[internalName],
|
|
applier = this[applyName];
|
|
|
|
if (applier) {
|
|
value = applier.call(this, value, oldValue);
|
|
|
|
if (typeof value == 'undefined') {
|
|
return this;
|
|
}
|
|
}
|
|
|
|
// The old value might have been changed at this point
|
|
// (after the apply call chain) so it should be read again
|
|
oldValue = this[internalName];
|
|
|
|
if (value !== oldValue) {
|
|
if (initialized) {
|
|
this.fireAction(changeEventName, [this, value, oldValue], this.doSet, this, {
|
|
nameMap: nameMap
|
|
});
|
|
}
|
|
else {
|
|
this[internalName] = value;
|
|
if (this[doSetName]) {
|
|
this[doSetName].call(this, value, oldValue);
|
|
}
|
|
}
|
|
}
|
|
|
|
return this;
|
|
}
|
|
}
|
|
},
|
|
|
|
initialized: false,
|
|
|
|
constructor: function(config) {
|
|
this.initialConfig = config;
|
|
this.initialize();
|
|
},
|
|
|
|
initialize: function() {
|
|
this.initConfig(this.initialConfig);
|
|
this.initialized = true;
|
|
},
|
|
|
|
doSet: function(me, value, oldValue, options) {
|
|
var nameMap = options.nameMap;
|
|
|
|
me[nameMap.internal] = value;
|
|
if (me[nameMap.doSet]) {
|
|
me[nameMap.doSet].call(this, value, oldValue);
|
|
}
|
|
},
|
|
|
|
onClassExtended: function(Class, data) {
|
|
if (!data.hasOwnProperty('eventedConfig')) {
|
|
return;
|
|
}
|
|
|
|
var ExtClass = Ext.Class,
|
|
config = data.config,
|
|
eventedConfig = data.eventedConfig,
|
|
name, nameMap;
|
|
|
|
data.config = (config) ? Ext.applyIf(config, eventedConfig) : eventedConfig;
|
|
|
|
/*
|
|
* These are generated setters for eventedConfig
|
|
*
|
|
* If the component is initialized, it invokes fireAction to fire the event as well,
|
|
* which indicate something has changed. Otherwise, it just executes the action
|
|
* (happens during initialization)
|
|
*
|
|
* This is helpful when we only want the event to be fired for subsequent changes.
|
|
* Also it's a major performance improvement for instantiation when fired events
|
|
* are mostly useless since there's no listeners
|
|
*/
|
|
for (name in eventedConfig) {
|
|
if (eventedConfig.hasOwnProperty(name)) {
|
|
nameMap = ExtClass.getConfigNameMap(name);
|
|
|
|
data[nameMap.set] = this.generateSetter(nameMap);
|
|
}
|
|
}
|
|
}
|
|
});
|