Skip to content

Commit d19276c

Browse files
committed
Merge remote-tracking branch 'DaveWM/master'
2 parents 478c1cd + 98fd70b commit d19276c

File tree

4 files changed

+98
-14
lines changed

4 files changed

+98
-14
lines changed

dist/angular-local-storage.js

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/**
22
* An Angular module that gives you access to the browsers local storage
3-
* @version v0.2.2 - 2015-05-29
3+
* @version v0.2.2 - 2015-07-15
44
* @link https://github.com/grevory/angular-local-storage
55
* @author grevory <[email protected]>
66
* @license MIT License, http://www.opensource.org/licenses/MIT
@@ -165,7 +165,6 @@ angularLocalStorage.provider('localStorageService', function() {
165165
// Directly get a value from local storage
166166
// Example use: localStorageService.get('library'); // returns 'angular'
167167
var getFromLocalStorage = function (key) {
168-
169168
if (!browserSupportsLocalStorage || self.storageType === 'cookie') {
170169
if (!browserSupportsLocalStorage) {
171170
$rootScope.$broadcast('LocalStorageModule.notification.warning','LOCAL_STORAGE_NOT_SUPPORTED');
@@ -400,12 +399,29 @@ angularLocalStorage.provider('localStorageService', function() {
400399
} else if (isObject(value) && isObject(def)) {
401400
value = extend(def, value);
402401
}
403-
404402
$parse(key).assign(scope, value);
405403

406-
return scope.$watch(key, function(newVal) {
404+
var onKeyUpdated = function (event) {
405+
if (event.key == deriveQualifiedKey(key)) {
406+
var updated = getFromLocalStorage(key);
407+
if(scope[key] && typeof scope[key] === "object"){
408+
angular.extend(scope[key], updated);
409+
}
410+
else {
411+
scope[key] = updated;
412+
}
413+
scope.$apply();
414+
}
415+
};
416+
$window.addEventListener("storage", onKeyUpdated, false);
417+
418+
var unregisterWatch = scope.$watch(key, function (newVal) {
407419
addToLocalStorage(lsKey, newVal);
408420
}, isObject(scope[key]));
421+
return function () {
422+
unregisterWatch();
423+
$window.removeEventListener("storage", onKeyUpdated);
424+
};
409425
};
410426

411427
// Return localStorageService.length

dist/angular-local-storage.min.js

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/angular-local-storage.js

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,6 @@ angularLocalStorage.provider('localStorageService', function() {
147147
// Directly get a value from local storage
148148
// Example use: localStorageService.get('library'); // returns 'angular'
149149
var getFromLocalStorage = function (key) {
150-
151150
if (!browserSupportsLocalStorage || self.storageType === 'cookie') {
152151
if (!browserSupportsLocalStorage) {
153152
$rootScope.$broadcast('LocalStorageModule.notification.warning','LOCAL_STORAGE_NOT_SUPPORTED');
@@ -382,12 +381,29 @@ angularLocalStorage.provider('localStorageService', function() {
382381
} else if (isObject(value) && isObject(def)) {
383382
value = extend(def, value);
384383
}
385-
386384
$parse(key).assign(scope, value);
387385

388-
return scope.$watch(key, function(newVal) {
386+
var onKeyUpdated = function (event) {
387+
if (event.key == deriveQualifiedKey(key)) {
388+
var updated = getFromLocalStorage(key);
389+
if(scope[key] && typeof scope[key] === "object"){
390+
angular.extend(scope[key], updated);
391+
}
392+
else {
393+
scope[key] = updated;
394+
}
395+
scope.$apply();
396+
}
397+
};
398+
$window.addEventListener("storage", onKeyUpdated, false);
399+
400+
var unregisterWatch = scope.$watch(key, function (newVal) {
389401
addToLocalStorage(lsKey, newVal);
390402
}, isObject(scope[key]));
403+
return function () {
404+
unregisterWatch();
405+
$window.removeEventListener("storage", onKeyUpdated);
406+
};
391407
};
392408

393409
// Return localStorageService.length

test/spec/localStorageSpec.js

Lines changed: 57 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
'use strict';
22

3+
/*global localStorageMock*/
34
describe('localStorageService', function() {
45
var elmSpy;
56

@@ -126,9 +127,16 @@ describe('localStorageService', function() {
126127
}
127128

128129
beforeEach(module('LocalStorageModule', function($provide) {
129-
130+
spyOn(window, 'addEventListener').andCallThrough();
131+
spyOn(window, 'removeEventListener').andCallThrough();
130132
$provide.value('$window', {
131-
localStorage: localStorageMock()
133+
localStorage: localStorageMock(),
134+
addEventListener: function () {
135+
window.addEventListener.apply(window, arguments);
136+
},
137+
removeEventListener : function (){
138+
window.removeEventListener.apply(window, arguments);
139+
}
132140
});
133141

134142
}));
@@ -267,7 +275,7 @@ describe('localStorageService', function() {
267275
addItem('key', '777'),
268276
expectAdding('ls.key', angular.toJson('777')),
269277
expectMatching('key', '777')
270-
)
278+
);
271279
});
272280

273281
it('should be able to get items', inject(
@@ -359,6 +367,7 @@ describe('localStorageService', function() {
359367
$rootScope.$digest();
360368

361369
expect($rootScope.property).toEqual(localStorageService.get('property'));
370+
expect(window.addEventListener).toHaveBeenCalled();
362371
}));
363372

364373
it('should be able to unbind from scope variable', inject(function($rootScope, localStorageService) {
@@ -376,6 +385,7 @@ describe('localStorageService', function() {
376385
$rootScope.$digest();
377386

378387
expect($rootScope.property).not.toEqual(localStorageService.get('property'));
388+
expect(window.removeEventListener).toHaveBeenCalled();
379389
}));
380390

381391
it('should be able to bind to properties of objects', inject(function($rootScope, localStorageService) {
@@ -391,6 +401,47 @@ describe('localStorageService', function() {
391401
expect($rootScope.obj.property).toEqual(localStorageService.get('obj.property'));
392402
}));
393403

404+
it('should update a bound value when local storage is updated', inject(function ($rootScope, localStorageService, $window){
405+
localStorageService.bind($rootScope, 'test');
406+
$rootScope.$digest();
407+
408+
// set the value in local storage mock to a value, then emit a changed event
409+
var testValue = 'test';
410+
$window.localStorage['ls.test'] = testValue;
411+
var evt = document.createEvent('CustomEvent');
412+
evt.key = 'ls.test';
413+
evt.newValue = 'test value';
414+
evt.initCustomEvent('storage', true, true, {
415+
key: 'ls.test',
416+
newValue: testValue
417+
});
418+
window.dispatchEvent(evt);
419+
$rootScope.$digest();
420+
421+
expect($rootScope.test).toEqual(testValue);
422+
}));
423+
424+
it('should keep unserializable properties of bound objects when local storage is updated', inject(function ($rootScope, localStorageService, $window){
425+
localStorageService.bind($rootScope, 'test');
426+
$rootScope.test = {obj: {a:1}, func: function (){}};
427+
// set the value in local storage mock to a value, then emit a changed event
428+
var testValue = JSON.stringify({obj:{a:2}});
429+
$window.localStorage['ls.test'] = testValue;
430+
var evt = document.createEvent('CustomEvent');
431+
evt.key = 'ls.test';
432+
evt.newValue = 'test value';
433+
evt.initCustomEvent('storage', true, true, {
434+
key: 'ls.test',
435+
newValue: testValue
436+
});
437+
window.dispatchEvent(evt);
438+
$rootScope.$digest();
439+
440+
expect($rootScope.test.obj).toEqual({a:2});
441+
expect($rootScope.test.func).toBeDefined();
442+
expect(typeof $rootScope.test.func).toBe('function');
443+
}));
444+
394445
it('should be able to bind to scope using different key', inject(function($rootScope, localStorageService) {
395446

396447
localStorageService.set('lsProperty', 'oldValue');
@@ -402,6 +453,7 @@ describe('localStorageService', function() {
402453
$rootScope.$digest();
403454

404455
expect($rootScope.property).toEqual(localStorageService.get('lsProperty'));
456+
expect(window.addEventListener).toHaveBeenCalled();
405457
}));
406458

407459
it('should $watch with deep comparison only for objects', inject(function($rootScope, localStorageService) {
@@ -477,7 +529,7 @@ describe('localStorageService', function() {
477529
localStorageService.set('keyAlpha', 'val');
478530

479531
localStorageService.clearAll(/^key/);
480-
532+
481533
for(var l = 0; l < 10; l++) {
482534
expect(localStorageService.get('key' + l)).toEqual(null);
483535
expect($window.localStorage.getItem('key' + l)).toEqual(null);
@@ -630,7 +682,7 @@ describe('localStorageService', function() {
630682

631683
it('should be able to clear all owned keys from cookie', inject(function(localStorageService, $document) {
632684
localStorageService.set('ownKey1', 1);
633-
$document.cookie = "username=John Doe";
685+
$document.cookie = 'username=John Doe';
634686
localStorageService.clearAll();
635687
expect(localStorageService.get('ownKey1')).toEqual(null);
636688
expect($document.cookie).not.toEqual('');

0 commit comments

Comments
 (0)