Форк Rambox
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

110 lines
3.3 KiB

/**
* @private
*/
Ext.define('Ext.Evented', {
alternateClassName: 'Ext.EventedBase',
mixins: [
'Ext.mixin.Observable'
],
statics: {
generateSetter: function (cfg) {
var names = cfg.names,
name = cfg.name,
prefixedName = names.internal,
applyName = names.apply,
changeEventName = names.changeEvent,
doSetName = names.doSet;
return function(value) {
var me = this,
internalName = me.$configPrefixed ? prefixedName : name,
initialized = me.initialized,
oldValue,
applier = me[applyName];
if (applier) {
value = applier.call(me, value, me[internalName]);
if (value === undefined) {
return me;
}
}
// The old value might have been changed at this point
// (after the apply call chain) so it should be read here
oldValue = me[internalName];
if (value !== oldValue) {
if (initialized) {
me.fireAction(changeEventName, [me, value, oldValue], me.doSet, me, {
nameMap: names
});
}
else {
me[internalName] = value;
if (me[doSetName]) {
me[doSetName](value, oldValue);
}
}
}
return this;
};
}
},
initialized: false,
constructor: function(config) {
this.mixins.observable.constructor.call(this, config);
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(cls, data) {
if (!data.hasOwnProperty('eventedConfig')) {
return;
}
var config = data.config,
eventedConfig = data.eventedConfig,
cacheName = 'eventedSetter',
name, cfg;
if (config) {
Ext.applyIf(config, eventedConfig);
} else {
cls.addConfig(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)) {
cfg = Ext.Config.get(name);
data[cfg.names.set] = cfg[cacheName] ||
(cfg[cacheName] = this.generateSetter(cfg));
}
}
}
});