/** * This class is used to store data on the client in a specified `storage` (either 'local' * or 'session'). Unlike the {@link Ext.data.proxy.LocalStorage localStorage proxy}, this * store uses a single `storageKey` to hold the entire contents of the store. This helps * reduce key overhead but also requires that all records and field be saved for any change. */Ext.define('Ext.data.ClientStore', { extend: 'Ext.data.Store', alias: 'store.clientstorage', requires: [ 'Ext.data.proxy.Memory' ], config: { /** * @cfg {"local"/"session"} storage * Specify 'local' to use `localStorage` and 'session' to use `sessionStorage`. */ storage: 'local', /** * @cfg {String} storageKey (required) * The key to use for saving the content of this store. */ storageKey: null }, trackRemoved: false, proxy: { type: 'memory', clearOnRead: true }, sync: function(options) { var me = this, key = me._getKey(), storage = me.getStorage(), source = me.getDataSource(), proxy = me.getProxy(), writer = proxy.getWriter(), writeAll = writer.getWriteAllFields(), data = []; try { me.suspendAutoSync(); writer.setWriteAllFields(true); source.each(function(rec) { if (rec.phantom) { rec.setId(me.nextId()); } data.push(writer.getRecordData(rec)); rec.commit(); }); if (data.length) { data = JSON.stringify(data); data = storage.setItem(key, data); } else { storage.removeItem(key); } if (options && options.success) { Ext.callback(options.success, options.scope || proxy, [null, options]); } } catch (e) { if (options && options.failure) { Ext.callback(options.failure, options.scope || proxy, [null, options]); } } finally { me.resumeAutoSync(); writer.setWriteAllFields(writeAll); } if (options && options.callback) { Ext.callback(options.callback, options.scope || proxy, [null, options]); } return me; }, applyStorage: function(storage) { var ret = Ext.global[storage + 'Storage']; //<debug> if (!ret || !ret.getItem || !ret.setItem) { Ext.raise('Invalid storage config "' + storage + '"; ' + 'expected "local" or "session"'); } //</debug> return ret; }, updateProxy: function(proxy, oldProxy) { var me = this, key = me._getKey(), storage = me.getStorage(), data; me.callParent([ proxy, oldProxy ]); data = storage.getItem(key); if (data) { proxy.setData(JSON.parse(data)); } }, privates: { _getKey: function() { var key = this.getStorageKey(); //<debug> if (!key) { Ext.raise('ClientStore requires a storageKey'); } //</debug> return key; }, nextId: function() { var source = this.getDataSource(), id = 1; while (source.containsKey(id)) { ++id; } return id; } }});