104 lines
3.6 KiB
JavaScript
Executable File
104 lines
3.6 KiB
JavaScript
Executable File
'use strict';
|
|
|
|
(function() {
|
|
|
|
/**
|
|
* @ngdoc overview
|
|
* @name ngStorage
|
|
*/
|
|
|
|
angular.module('ngStorage', []).
|
|
|
|
/**
|
|
* @ngdoc object
|
|
* @name ngStorage.$localStorage
|
|
* @requires $rootScope
|
|
* @requires $window
|
|
*/
|
|
|
|
factory('$localStorage', _storageFactory('localStorage')).
|
|
|
|
/**
|
|
* @ngdoc object
|
|
* @name ngStorage.$sessionStorage
|
|
* @requires $rootScope
|
|
* @requires $window
|
|
*/
|
|
|
|
factory('$sessionStorage', _storageFactory('sessionStorage'));
|
|
|
|
function _storageFactory(storageType) {
|
|
return [
|
|
'$rootScope',
|
|
'$window',
|
|
|
|
function(
|
|
$rootScope,
|
|
$window
|
|
){
|
|
// #9: Assign a placeholder object if Web Storage is unavailable to prevent breaking the entire AngularJS app
|
|
var webStorage = $window[storageType] || (console.warn('This browser does not support Web Storage!'), {}),
|
|
$storage = {
|
|
$default: function(items) {
|
|
for (var k in items) {
|
|
angular.isDefined($storage[k]) || ($storage[k] = items[k]);
|
|
}
|
|
|
|
return $storage;
|
|
},
|
|
$reset: function(items) {
|
|
for (var k in $storage) {
|
|
'$' === k[0] || delete $storage[k];
|
|
}
|
|
|
|
return $storage.$default(items);
|
|
}
|
|
},
|
|
_last$storage,
|
|
_debounce;
|
|
|
|
for (var i = 0, k; i < webStorage.length; i++) {
|
|
// #8, #10: `webStorage.key(i)` may be an empty string (or throw an exception in IE9 if `webStorage` is empty)
|
|
(k = webStorage.key(i)) && 'ngStorage-' === k.slice(0, 10) && ($storage[k.slice(10)] = angular.fromJson(webStorage.getItem(k)));
|
|
}
|
|
|
|
_last$storage = angular.copy($storage);
|
|
|
|
$rootScope.$watch(function() {
|
|
_debounce || (_debounce = setTimeout(function() {
|
|
_debounce = null;
|
|
|
|
if (!angular.equals($storage, _last$storage)) {
|
|
angular.forEach($storage, function(v, k) {
|
|
angular.isDefined(v) && '$' !== k[0] && webStorage.setItem('ngStorage-' + k, angular.toJson(v));
|
|
|
|
delete _last$storage[k];
|
|
});
|
|
|
|
for (var k in _last$storage) {
|
|
webStorage.removeItem('ngStorage-' + k);
|
|
}
|
|
|
|
_last$storage = angular.copy($storage);
|
|
}
|
|
}, 100));
|
|
});
|
|
|
|
// #6: Use `$window.addEventListener` instead of `angular.element` to avoid the jQuery-specific `event.originalEvent`
|
|
'localStorage' === storageType && $window.addEventListener && $window.addEventListener('storage', function(event) {
|
|
if ('ngStorage-' === event.key.slice(0, 10)) {
|
|
event.newValue ? $storage[event.key.slice(10)] = angular.fromJson(event.newValue) : delete $storage[event.key.slice(10)];
|
|
|
|
_last$storage = angular.copy($storage);
|
|
|
|
$rootScope.$apply();
|
|
}
|
|
});
|
|
|
|
return $storage;
|
|
}
|
|
];
|
|
}
|
|
|
|
})();
|