-
Notifications
You must be signed in to change notification settings - Fork 0
/
knockout.localstorage.js
65 lines (56 loc) · 1.96 KB
/
knockout.localstorage.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
define(['jquery', 'knockout', 'knockout.mapping'], function($, ko, mapping) {
return {
// Used to store an observable in the localStorage.
observable: function(key, properties) {
if (!$.isPlainObject(properties)) {
properties = {};
}
var value;
// Get the initial observable value.
var fromLocalStorage = window.localStorage[key];
if (undefined === fromLocalStorage) {
value = properties.defaultValue;
window.localStorage[key] = value;
} else {
value = ko.utils.parseJson(fromLocalStorage);
}
// Construct the observable.
var observable = ko.observable(value);
observable.subscribe(function(newValue) {
// On change, write the new value to the localStorage.
window.localStorage[key] = ko.toJSON(newValue);
});
return observable;
},
// Used to store an observableArray in the localStorage.
observableArray: function(key, properties) {
if (!$.isPlainObject(properties)) {
properties = {};
}
var observable;
var fromLocalStorage = window.localStorage[key];
// Get the initial observable value.
if (undefined === fromLocalStorage || '' === fromLocalStorage || null === fromLocalStorage) {
// First time, there is no value stored in the localStorage.
var defaultValue = properties.defaultValue || [];
window.localStorage[key] = defaultValue;
fromLocalStorage = defaultValue;
} else {
fromLocalStorage = ko.utils.parseJson(fromLocalStorage);
if ($.isPlainObject(properties.mapping)) {
// Map all objects that in the array. Using the knockout.mapping plugin.
observable = mapping.fromJS(fromLocalStorage, properties.mapping);
}
}
// If `observable` isn't a observable object.
if (!observable) {
observable = ko.observableArray(fromLocalStorage);
}
observable.subscribe(function(newValue) {
// On change, store the new value in the localStorage.
window.localStorage[key] = ko.toJSON(newValue);
});
return observable;
}
};
});