hangoutsslackgmailskypefacebook-workplaceoutlookemailmicrosoft-teamsdiscordmessengercustom-servicesmacoslinuxwindowsinboxwhatsappicloudtweetdeckhipchattelegram
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.
109 lines
3.3 KiB
109 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)); |
|
} |
|
} |
|
} |
|
});
|
|
|