ngStorage.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. 'use strict';
  2. (function() {
  3. /**
  4. * @ngdoc overview
  5. * @name ngStorage
  6. */
  7. angular.module('ngStorage', []).
  8. /**
  9. * @ngdoc object
  10. * @name ngStorage.$localStorage
  11. * @requires $rootScope
  12. * @requires $window
  13. */
  14. factory('$localStorage', _storageFactory('localStorage')).
  15. /**
  16. * @ngdoc object
  17. * @name ngStorage.$sessionStorage
  18. * @requires $rootScope
  19. * @requires $window
  20. */
  21. factory('$sessionStorage', _storageFactory('sessionStorage'));
  22. function _storageFactory(storageType) {
  23. return [
  24. '$rootScope',
  25. '$window',
  26. function(
  27. $rootScope,
  28. $window
  29. ){
  30. // #9: Assign a placeholder object if Web Storage is unavailable to prevent breaking the entire AngularJS app
  31. var webStorage = $window[storageType] || (console.warn('This browser does not support Web Storage!'), {}),
  32. $storage = {
  33. $default: function(items) {
  34. for (var k in items) {
  35. angular.isDefined($storage[k]) || ($storage[k] = items[k]);
  36. }
  37. return $storage;
  38. },
  39. $reset: function(items) {
  40. for (var k in $storage) {
  41. '$' === k[0] || delete $storage[k];
  42. }
  43. return $storage.$default(items);
  44. }
  45. },
  46. _last$storage,
  47. _debounce;
  48. for (var i = 0, k; i < webStorage.length; i++) {
  49. // #8, #10: `webStorage.key(i)` may be an empty string (or throw an exception in IE9 if `webStorage` is empty)
  50. (k = webStorage.key(i)) && 'ngStorage-' === k.slice(0, 10) && ($storage[k.slice(10)] = angular.fromJson(webStorage.getItem(k)));
  51. }
  52. _last$storage = angular.copy($storage);
  53. $rootScope.$watch(function() {
  54. _debounce || (_debounce = setTimeout(function() {
  55. _debounce = null;
  56. if (!angular.equals($storage, _last$storage)) {
  57. angular.forEach($storage, function(v, k) {
  58. angular.isDefined(v) && '$' !== k[0] && webStorage.setItem('ngStorage-' + k, angular.toJson(v));
  59. delete _last$storage[k];
  60. });
  61. for (var k in _last$storage) {
  62. webStorage.removeItem('ngStorage-' + k);
  63. }
  64. _last$storage = angular.copy($storage);
  65. }
  66. }, 100));
  67. });
  68. // #6: Use `$window.addEventListener` instead of `angular.element` to avoid the jQuery-specific `event.originalEvent`
  69. 'localStorage' === storageType && $window.addEventListener && $window.addEventListener('storage', function(event) {
  70. if ('ngStorage-' === event.key.slice(0, 10)) {
  71. event.newValue ? $storage[event.key.slice(10)] = angular.fromJson(event.newValue) : delete $storage[event.key.slice(10)];
  72. _last$storage = angular.copy($storage);
  73. $rootScope.$apply();
  74. }
  75. });
  76. return $storage;
  77. }
  78. ];
  79. }
  80. })();