2015-04-28 4 views
5

Ist es möglich, $ watch zu verwenden, um Änderungen an localStorage zu überwachen?Wie Sie mit AngularJS nach lokalen Speicheränderungen suchen

Ich habe eine Fabrik zu machen Einstellung/immer ein wenig einfache

.factory('$localstorage', ['$window', function($window) { 
    return { 
     set: function(key, value) { 
      $window.localStorage[key] = value; 
     }, 

     get: function(key, defaultValue) { 
      return $window.localStorage[key] || defaultValue; 
     }, 

     setObject: function(key, value) { 
      $window.localStorage[key] = JSON.stringify(value); 
     }, 

     getObject: function(key) { 
      return JSON.parse($window.localStorage[key] || '{}'); 
     } 
    } 
}]); 

In meinem Controller habe ich

.controller('CodesCtrl', function($scope, $localstorage) { 
    $scope.codes = $localstorage.getObject('codes'); 
    ... 

In einem anderen Controller ich auf einem lokalen Speicher hinzugefügt werde. Ich möchte die Änderungen rendern, sobald sich localStorage ändert.

Ich habe ein paar SO-Posts gesehen, die Dinge wie ngStorage verwenden, aber im Idealfall möchte ich das vermeiden.

Ist es möglich? Könnte mir jemand in die richtige Richtung zeigen?

+0

Überlastung 'localStorage.getItem' und' localStorage.setItem' mit Ihrem eigenen Methoden. – dandavis

Antwort

9

Sie können eine $ watch-Funktion erstellen, die alles zurückgibt, was Sie möchten. Wenn es sich ändert, wird Ihre $ watch ausgeführt.

$scope.$watch(function(){ 
    return $localstorage.getObject('codes'); 
}, function(newCodes, oldCodes){ 
    $scope.codes = newCodes; 
}); 

Stellen Sie sicher, dass auf Performance-Tests zu tun. Diese Funktion wird sehr oft aufgerufen.


Eine bessere Möglichkeit wäre Ereignisse zu verwenden und nur codes zu aktualisieren, wenn nötig.

-Controller A:

var codes = updateCodesAndStoreInLocalStorage(); // <That part's up to you 
$rootScope.$emit('codesUpdated', codes); 

Steuerung B:

$rootScope.$on('codesUpdated', function(event, codes){ 
    $scope.codes = codes; //Rely on localStorage for "storage" only, not for communication. 
}); 
+0

Beachten Sie, dass der Überwachungshandler nicht sofort aufgerufen wird, wenn sich der Wert in localStorage ändert. Da Angular nur alte Werte mit neuen Werten (Dirty Checking) in einem $ Digest vergleicht, wird der Watch-Handler nur aufgerufen, wenn ein $ digest auftritt. Die meisten vom Benutzer initiierten Aktionen starten einen $ digest (d. H. Ng-click), aber wenn Sie erwarten, dass Dinge automatisch passieren, müssen Sie wissen, wie Watch Handler aufgerufen werden. – user2943490

+0

Angulars Wrapper für Dinge wie $ localstorage und $ timeout existieren, um $ Digest-Zyklen auszulösen, wenn sie benutzt wurden, also sollte das kein Problem sein. – HankScorpio

+0

können Sie bitte mehr über Ihren 2. Weg ausarbeiten. kann es nicht klar, ich möchte auch wie James –

Verwandte Themen