/** * @class Ext.data.StoreManager * @extends Ext.util.MixedCollection * <p>Contains a collection of all stores that are created that have an identifier. * An identifier can be assigned by setting the {@link Ext.data.AbstractStore#storeId storeId} * property. When a store is in the StoreManager, it can be referred to via it's identifier: * <pre><code> Ext.create('Ext.data.Store', { model: 'SomeModel', storeId: 'myStore' }); var store = Ext.data.StoreManager.lookup('myStore'); * </code></pre> * Also note that the {@link #lookup} method is aliased to {@link Ext#getStore} for convenience.</p> * <p> * If a store is registered with the StoreManager, you can also refer to the store by it's identifier when * registering it with any Component that consumes data from a store: * <pre><code> Ext.create('Ext.data.Store', { model: 'SomeModel', storeId: 'myStore' }); Ext.create('Ext.view.View', { store: 'myStore', // other configuration here }); * </code></pre> * </p> * @singleton * @docauthor Evan Trimboli <evan@sencha.com> * TODO: Make this an AbstractMgr */ Ext.define('Ext.data.StoreManager', { extend: 'Ext.util.MixedCollection', alternateClassName: ['Ext.StoreMgr', 'Ext.data.StoreMgr', 'Ext.StoreManager'], singleton: true, uses: ['Ext.data.ArrayStore'], /** * @cfg {Object} listeners @hide */ /** * Registers one or more Stores with the StoreManager. You do not normally need to register stores * manually. Any store initialized with a {@link Ext.data.Store#storeId} will be auto-registered. * @param {Ext.data.Store} store1 A Store instance * @param {Ext.data.Store} store2 (optional) * @param {Ext.data.Store} etc... (optional) */ register : function() { for (var i = 0, s; (s = arguments[i]); i++) { this.add(s); } }, /** * Unregisters one or more Stores with the StoreManager * @param {String/Object} id1 The id of the Store, or a Store instance * @param {String/Object} id2 (optional) * @param {String/Object} etc... (optional) */ unregister : function() { for (var i = 0, s; (s = arguments[i]); i++) { this.remove(this.lookup(s)); } }, /** * Gets a registered Store by id * @param {String/Object} id The id of the Store, or a Store instance, or a store configuration * @return {Ext.data.Store} */ lookup : function(store) { // handle the case when we are given an array or an array of arrays. if (Ext.isArray(store)) { var fields = ['field1'], expand = !Ext.isArray(store[0]), data = store, i, len; if(expand){ data = []; for (i = 0, len = store.length; i < len; ++i) { data.push([store[i]]); } } else { for(i = 2, len = store[0].length; i <= len; ++i){ fields.push('field' + i); } } return Ext.create('Ext.data.ArrayStore', { data : data, fields: fields, autoDestroy: true, autoCreated: true, expanded: expand }); } if (Ext.isString(store)) { // store id return this.get(store); } else { // store instance or store config return Ext.data.AbstractStore.create(store); } }, // getKey implementation for MixedCollection getKey : function(o) { return o.storeId; } }, function() { /** * <p>Creates a new store for the given id and config, then registers it with the {@link Ext.data.StoreManager Store Mananger}. * Sample usage:</p> <pre><code> Ext.regStore('AllUsers', { model: 'User' }); //the store can now easily be used throughout the application new Ext.List({ store: 'AllUsers', ... other config }); </code></pre> * @param {String} id The id to set on the new store * @param {Object} config The store config * @param {Constructor} cls The new Component class. * @member Ext * @method regStore */ Ext.regStore = function(name, config) { var store; if (Ext.isObject(name)) { config = name; } else { config.storeId = name; } if (config instanceof Ext.data.Store) { store = config; } else { store = Ext.create('Ext.data.Store', config); } return Ext.data.StoreManager.register(store); }; /** * Gets a registered Store by id (shortcut to {@link Ext.data.StoreManager#lookup}) * @param {String/Object} id The id of the Store, or a Store instance * @return {Ext.data.Store} * @member Ext * @method getStore */ Ext.getStore = function(name) { return Ext.data.StoreManager.lookup(name); }; });