Cookie fallback support

dev
grevory 12 years ago
parent 53672c1e23
commit 4dc2661ec8

@ -6,7 +6,7 @@ An Angular module that gives you access to the browsers local storage
Remember to set your app name (settings.appPrefix) in the settings at the beginning of localStorageModule.js. Remember to set your app name (settings.appPrefix) in the settings at the beginning of localStorageModule.js.
To do: To do:
- Set cookies as a failback for browsers that do not support local storage - Add tests
- Expand Readme - Expand Readme
Example use: Example use:

@ -6,4 +6,5 @@ var DemoCtrl = function($scope, localStorageService) {
localStorageService.add('localStorageDemo',value); localStorageService.add('localStorageDemo',value);
$scope.localStorageDemoValue = localStorageService.get('localStorageDemo'); $scope.localStorageDemoValue = localStorageService.get('localStorageDemo');
}); });
}; };

@ -69,6 +69,8 @@ var YourCtrl = function($scope, localStorageService, ...) {
localStorageService.add('localStorageKey','Add this!'); localStorageService.add('localStorageKey','Add this!');
// Read that value back // Read that value back
var value = localStorageService.get('localStorageKey'); var value = localStorageService.get('localStorageKey');
// You can also play with cookies the same way
localStorageService.cookie.add('localStorageKey','I am a cookie value now');
}</pre> }</pre>
<h3>API Access</h3> <h3>API Access</h3>
@ -85,7 +87,7 @@ var YourCtrl = function($scope, localStorageService, ...) {
<tbody> <tbody>
<tr> <tr>
<td><code>isSupported</code></td> <td><code>isSupported</code></td>
<td class="muted">n/a</td> <td class="muted"><small>n/a</small></td>
<td>Checks the browsers support for local storage</td> <td>Checks the browsers support for local storage</td>
<td>Boolean for success</td> <td>Boolean for success</td>
</tr> </tr>
@ -113,6 +115,12 @@ var YourCtrl = function($scope, localStorageService, ...) {
<td><span class="label label-warning">Warning</span> Removes all local storage key-value pairs for this app.</td> <td><span class="label label-warning">Warning</span> Removes all local storage key-value pairs for this app.</td>
<td>Boolean for success</td> <td>Boolean for success</td>
</tr> </tr>
<tr>
<td><code>cookie</code></td>
<td><small>add | get | remove | clearAll</small></td>
<td>Each function within cookie uses the same arguments as the coresponding local storage functions</td>
<td>n/a</td>
</tr>
</tbody> </tbody>
</table> </table>

@ -1,19 +1,20 @@
// Configure Angular Local Storage
var settings = {
// You should set a prefix to avoid overwriting any local storage variables from the rest of your app
// prefix: 'youAppNameHere'
appPrefix: 'test'
};
/* Start angularLocalStorage */ /* Start angularLocalStorage */
var angularLocalStorage = angular.module('LocalStorageModule', []) var angularLocalStorage = angular.module('LocalStorageModule', []);
// Set the prefix based on the settings object above // You should set a prefix to avoid overwriting any local storage variables from the rest of your app
angularLocalStorage.constant('prefix', settings.appPrefix || ''); // e.g. angularLocalStorage.constant('prefix', 'youAppName');
angularLocalStorage.constant('prefix', 'ls');
// Cookie options (usually in case of fallback)
// expiry = Number of days before cookies expire // 0 = Does not expire
// path = The web path the cookie represents
angularLocalStorage.constant('cookie', { expiry:30, path: '/'});
angularLocalStorage.service('localStorageService', ['prefix', function(prefix) { angularLocalStorage.service('localStorageService', [
'$rootScope',
'prefix',
'cookie',
function($rootScope, prefix, cookie) {
// If there is a prefix set in the config lets use that with an appended period for readability // If there is a prefix set in the config lets use that with an appended period for readability
//var prefix = angularLocalStorage.constant; //var prefix = angularLocalStorage.constant;
@ -26,6 +27,7 @@ angularLocalStorage.service('localStorageService', ['prefix', function(prefix) {
try { try {
return ('localStorage' in window && window['localStorage'] !== null); return ('localStorage' in window && window['localStorage'] !== null);
} catch (e) { } catch (e) {
$rootScope.$broadcast('LocalStorageModule.notification.error',e.Description);
return false; return false;
} }
}; };
@ -37,7 +39,7 @@ angularLocalStorage.service('localStorageService', ['prefix', function(prefix) {
// If this browser does not support local storage use cookies // If this browser does not support local storage use cookies
if (!browserSupportsLocalStorage()) { if (!browserSupportsLocalStorage()) {
console.log('Cannot add to local storage. Get from cookies'); // todo $rootScope.$broadcast('LocalStorageModule.notification.warning','LOCAL_STORAGE_NOT_SUPPORTED');
return false; return false;
} }
@ -47,7 +49,7 @@ angularLocalStorage.service('localStorageService', ['prefix', function(prefix) {
try { try {
localStorage.setItem(prefix+key, value); localStorage.setItem(prefix+key, value);
} catch (e) { } catch (e) {
console.error(e.Description); $rootScope.$broadcast('LocalStorageModule.notification.error',e.Description);
return false; return false;
} }
return true; return true;
@ -57,28 +59,27 @@ angularLocalStorage.service('localStorageService', ['prefix', function(prefix) {
// Example use: localStorageService.get('library'); // returns 'angular' // Example use: localStorageService.get('library'); // returns 'angular'
var getFromLocalStorage = function (key) { var getFromLocalStorage = function (key) {
if (!browserSupportsLocalStorage()) { if (!browserSupportsLocalStorage()) {
console.log('Cannot get from local storage. Use cookies'); // todo $rootScope.$broadcast('LocalStorageModule.notification.warning','LOCAL_STORAGE_NOT_SUPPORTED');
return false; return false;
} }
var item = localStorage.getItem(prefix+key); var item = localStorage.getItem(prefix+key);
if (!item) return null; if (!item) return null;
return item; return item;
//or localStorage[key];
}; };
// Remove an item from local storage // Remove an item from local storage
// Example use: localStorageService.remove('library'); // removes the key/value pair of library='angular' // Example use: localStorageService.remove('library'); // removes the key/value pair of library='angular'
var removeFromLocalStorage = function (key) { var removeFromLocalStorage = function (key) {
if (!browserSupportsLocalStorage()) { if (!browserSupportsLocalStorage()) {
console.log('Cannot remove item from local storage. Remove from cookies'); // todo $rootScope.$broadcast('LocalStorageModule.notification.warning','LOCAL_STORAGE_NOT_SUPPORTED');
return false; return false;
} }
try { try {
localStorage.removeItem(prefix+key); localStorage.removeItem(prefix+key);
} catch (e) { } catch (e) {
console.error(e.Description); $rootScope.$broadcast('LocalStorageModule.notification.error',e.Description);
return false; return false;
} }
return true; return true;
@ -90,7 +91,7 @@ angularLocalStorage.service('localStorageService', ['prefix', function(prefix) {
var clearAllFromLocalStorage = function () { var clearAllFromLocalStorage = function () {
if (!browserSupportsLocalStorage()) { if (!browserSupportsLocalStorage()) {
console.log('Cannot remove all items from local storage. Remove all app cookies'); // todo $rootScope.$broadcast('LocalStorageModule.notification.warning','LOCAL_STORAGE_NOT_SUPPORTED');
return false; return false;
} }
@ -102,7 +103,7 @@ angularLocalStorage.service('localStorageService', ['prefix', function(prefix) {
try { try {
removeFromLocalStorage(key.substr(prefixLength)); removeFromLocalStorage(key.substr(prefixLength));
} catch (e) { } catch (e) {
console.error(e.Description); $rootScope.$broadcast('LocalStorageModule.notification.error',e.Description);
return false; return false;
} }
} }
@ -110,12 +111,100 @@ angularLocalStorage.service('localStorageService', ['prefix', function(prefix) {
return true; return true;
}; };
// Checks the browser to see if cookies are supported
var browserSupportsCookies = function() {
try {
return navigator.cookieEnabled ||
("cookie" in document && (document.cookie.length > 0 ||
(document.cookie = "test").indexOf.call(document.cookie, "test") > -1));
} catch (e) {
$rootScope.$broadcast('LocalStorageModule.notification.error',e.Description);
return false;
}
}
// Directly adds a value to cookies
// Typically used as a fallback is local storage is not available in the browser
// Example use: localStorageService.cookie.add('library','angular');
var addToCookies = function (key, value) {
if (typeof value == "undefined") return false;
if (!browserSupportsCookies()) {
$rootScope.$broadcast('LocalStorageModule.notification.error','COOKIES_NOT_SUPPORTED');
return false;
}
try {
var expiry = '', expiryDate = new Date();
if (value === null) {
cookie.expiry = -1;
value = '';
}
if (cookie.expiry !== 0) {
expiryDate.setTime(expiryDate.getTime() + (cookie.expiry*24*60*60*1000));
expiry = "; expires="+expiryDate.toGMTString();
}
document.cookie = prefix + key + "=" + encodeURIComponent(value) + expiry + "; path="+cookie.path;
} catch (e) {
$rootScope.$broadcast('LocalStorageModule.notification.error',e.Description);
return false;
}
return true;
};
// Directly get a value from a cookie
// Example use: localStorageService.cookie.get('library'); // returns 'angular'
var getFromCookies = function (key) {
if (!browserSupportsCookies()) {
$rootScope.$broadcast('LocalStorageModule.notification.error','COOKIES_NOT_SUPPORTED');
return false;
}
var cookies = document.cookie.split(';');
for(var i=0;i < cookies.length;i++) {
var thisCookie = cookies[i];
while (thisCookie.charAt(0)==' ') {
thisCookie = thisCookie.substring(1,thisCookie.length);
}
if (thisCookie.indexOf(prefix+key+'=') == 0) {
return decodeURIComponent(thisCookie.substring(prefix.length+key.length+1,thisCookie.length));
}
}
return null;
};
var removeFromCookies = function (key) {
addToCookies(key,null);
}
var clearAllFromCookies = function () {
var thisCookie = null, thisKey = null;
var prefixLength = prefix.length;
var cookies = document.cookie.split(';');
for(var i=0;i < cookies.length;i++) {
thisCookie = cookies[i];
while (thisCookie.charAt(0)==' ') {
thisCookie = thisCookie.substring(1,thisCookie.length);
}
key = thisCookie.substring(prefixLength,thisCookie.indexOf('='));
removeFromCookies(key);
}
}
return { return {
isSupported: browserSupportsLocalStorage, isSupported: browserSupportsLocalStorage,
add: addToLocalStorage, add: addToLocalStorage,
get: getFromLocalStorage, get: getFromLocalStorage,
remove: removeFromLocalStorage, remove: removeFromLocalStorage,
clearAll: clearAllFromLocalStorage clearAll: clearAllFromLocalStorage,
cookie: {
add: addToCookies,
get: getFromCookies,
remove: removeFromCookies,
clearAll: clearAllFromCookies
}
}; };
}]); }]);