todomvc
Version:
> Helping you select an MV\* framework
120 lines (95 loc) • 3.41 kB
JavaScript
(function ($, kendo) {
'use strict';
var itemBase, separator, idField;
kendo.data.extensions = kendo.data.extensions || {};
// Function to create a quasi-unique GUID for localStorage
var getGuid = function () {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);
return v.toString(16);
});
};
// Obtains the list of keys from localStorage
var getKeys = function () {
var keysList = localStorage.getItem(itemBase);
return keysList ? keysList.split(',') : [];
};
// Checks the localStorage key list for the current id and,
// if it doesn't exist, adds that key to the list and saves
// the list back to localStorage.
var addKeyIfNew = function (id) {
var keys = getKeys(),
matchingKey = $.grep(keys, function (key) { return key === id; });
if (!matchingKey.length) {
keys.push(id);
localStorage.setItem(itemBase, keys.join(','));
}
};
// Fetches an array of objects from localStorage
var getFromLocalStorage = function () {
var keys = getKeys(),
todos = [];
$.each(keys, function (index, value) {
var item = localStorage.getItem(itemBase + separator + value);
if (item) {
todos.push(JSON.parse(item));
}
});
return todos;
};
// Saves the current item to localStorage
var saveToLocalStorage = function (data) {
if (!data[idField]) {
data[idField] = getGuid();
}
addKeyIfNew(data[idField]);
localStorage.setItem(itemBase + separator + data[idField], JSON.stringify(data));
};
// Removes the current item from localStorage
var removeFromLocalStorage = function (data) {
var keys = getKeys();
var index = keys.indexOf(data[idField]);
if (index >= 0) {
keys.splice(index, 1);
localStorage.setItem(itemBase, keys.join(','));
localStorage.removeItem(itemBase + separator + data[idField]);
}
};
// Specify a CRUD transport object for our custom Kendo DataSource
var localTransports = {
read: function (options) {
var todos = getFromLocalStorage();
options.success(todos);
},
create: function (options) {
saveToLocalStorage(options.data);
options.success(options.data);
},
update: function (options) {
saveToLocalStorage(options.data);
options.success(options.data);
},
destroy: function (options) {
removeFromLocalStorage(options.data);
options.success(options.data);
}
};
// Create the custom DataSource by extending a kendo.data.DataSource
// and specify an init method that wires up needed functionality.
kendo.data.extensions.LocalStorageDataSource = kendo.data.DataSource.extend({
init: function (options) {
// DataSource consumers can specify custom itemBase and separator
// strings when initializing the DataSource. These values are
// used when saving records to localStorage.
itemBase = options.itemBase || 'kendo-ds';
separator = options.separator || '-';
idField = options.schema.model.idField;
// The idField is required. If not specified on the model, throw an error
if (!idField) {
throw new Error('An id field is required in order to work with localStorage. Please specify an id on your Model.');
}
// Call the "base" DataSource init function and provide our custom transport object
kendo.data.DataSource.fn.init.call(this, $.extend(true, {}, { transport: localTransports }, options));
}
});
})($, kendo);