/**
* This mixin is used to track and listen to the `store` of its `owner` component. The
* component must support a `storechange` event (as do grids and dataviews) as well as
* a `getStore` method.
* @since 6.5.0
*/
Ext.define('Ext.mixin.StoreWatcher', {
mixinId: 'storewatcher',
config: {
dataSource: null,
/**
* @cfg {Ext.Base} owner
*/
owner: null,
/**
* @cfg {Object} ownerListeners
* The events and associated handlers to which to listen on the `owner`.
*/
ownerListeners: {
destroyable: true,
storechange: 'onOwnerStoreChange'
},
/**
* @cfg {Object} sourceListeners
* The events and associated handlers to which to listen on the `source` of the
* connected `store`. That is, these listeners are attached to the unfiltered
* collection. When `remoteFilter` is `true` there is no unfiltered collection so
* these listeners are attached to the only collection that exists (which is
* filtered by the server).
*/
sourceListeners: null,
store: null,
/**
* @cfg {Object} storeListeners
* The events and associated handlers to which to listen on the `store` of the
* `owner`.
*/
storeListeners: null
},
afterClassMixedIn: function(targetClass) {
var configurator = this.getConfigurator(),
prototype = targetClass.prototype,
config = {},
prop;
for (prop in configurator.configs) {
// For each of our configs, see if the class declared them as well. If so
// we need to merge their values on top of ours and remove them from the
// class prototype.
if (prototype.hasOwnProperty(prop)) {
config[prop] = prototype[prop];
delete prototype[prop];
}
}
targetClass.addConfig(config);
},
onOwnerStoreChange: function(comp, store) {
this.setStore(store);
},
//---------------------------
// dataSource
updateDataSource: function(source) {
this.syncListeners(source, '$sourceListeners', 'getSourceListeners');
},
// owner
updateOwner: function(owner) {
var me = this,
ownerProperty = me.ownerProperty;
if (ownerProperty) {
me[ownerProperty] = owner;
}
me.syncListeners(owner, '$ownerListeners', 'getOwnerListeners');
me.setStore(owner ? owner.getStore() : null);
},
// store
applyStore: function(store) {
return (store && !store.isEmptyStore) ? store : null;
},
updateStore: function(store) {
this.syncListeners(store, '$storeListeners', 'getStoreListeners');
this.syncDataSource();
},
privates: {
syncDataSource: function() {
var store = this.getStore(),
source;
if (!store) {
source = null;
}
else if (store.getDataSource) {
source = store.getDataSource();
}
else {
source = store.getData();
}
this.setDataSource(source);
},
syncListeners: function(instance, token, listeners) {
var me = this,
old = me[token];
if (old) {
me[token] = null;
old.destroy();
}
if (instance) {
listeners = me[listeners]();
listeners = Ext.applyIf({
destroyable: true,
scope: me
}, listeners);
me[token] = instance.on(listeners);
}
}
}
});