UNPKG

devextreme

Version:

HTML5 JavaScript Component Suite for Responsive Web Development

156 lines (130 loc) 3.97 kB
"use strict"; var eventsEngine = require("../events/core/events_engine"), domAdapter = require("../core/dom_adapter"), windowUtils = require("../core/utils/window"), window = windowUtils.getWindow(), Class = require("../core/class"), abstract = Class.abstract, errors = require("./errors").errors, ArrayStore = require("./array_store"); var LocalStoreBackend = Class.inherit({ ctor: function ctor(store, storeOptions) { this._store = store; this._dirty = !!storeOptions.data; this.save(); var immediate = this._immediate = storeOptions.immediate; var flushInterval = Math.max(100, storeOptions.flushInterval || 10 * 1000); if (!immediate) { var saveProxy = this.save.bind(this); setInterval(saveProxy, flushInterval); eventsEngine.on(window, "beforeunload", saveProxy); if (window.cordova) { domAdapter.listen(domAdapter.getDocument(), "pause", saveProxy, false); } } }, notifyChanged: function notifyChanged() { this._dirty = true; if (this._immediate) { this.save(); } }, load: function load() { this._store._array = this._loadImpl(); this._dirty = false; }, save: function save() { if (!this._dirty) { return; } this._saveImpl(this._store._array); this._dirty = false; }, _loadImpl: abstract, _saveImpl: abstract }); var DomLocalStoreBackend = LocalStoreBackend.inherit({ ctor: function ctor(store, storeOptions) { var name = storeOptions.name; if (!name) { throw errors.Error("E4013"); } this._key = "dx-data-localStore-" + name; this.callBase(store, storeOptions); }, _loadImpl: function _loadImpl() { var raw = window.localStorage.getItem(this._key); if (raw) { return JSON.parse(raw); } return []; }, _saveImpl: function _saveImpl(array) { if (!array.length) { window.localStorage.removeItem(this._key); } else { window.localStorage.setItem(this._key, JSON.stringify(array)); } } }); var localStoreBackends = { "dom": DomLocalStoreBackend }; /** * @name LocalStore * @publicName LocalStore * @inherits ArrayStore * @type object * @module data/local_store * @export default */ var LocalStore = ArrayStore.inherit({ ctor: function ctor(options) { /** * @name LocalStoreOptions.name * @publicName name * @type string */ if (typeof options === "string") { options = { name: options }; } else { options = options || {}; } this.callBase(options); /** * @name LocalStoreOptions.immediate * @publicName immediate * @type boolean * @default false */ /** * @name LocalStoreOptions.flushInterval * @publicName flushInterval * @type number * @default 10000 */ this._backend = new localStoreBackends[options.backend || "dom"](this, options); this._backend.load(); }, /** * @name LocalStoreMethods.clear * @publicName clear() */ clear: function clear() { this.callBase(); this._backend.notifyChanged(); }, _insertImpl: function _insertImpl(values) { var b = this._backend; return this.callBase(values).done(b.notifyChanged.bind(b)); }, _updateImpl: function _updateImpl(key, values) { var b = this._backend; return this.callBase(key, values).done(b.notifyChanged.bind(b)); }, _removeImpl: function _removeImpl(key) { var b = this._backend; return this.callBase(key).done(b.notifyChanged.bind(b)); } }, "local"); module.exports = LocalStore;