angularjs和localStorage更改事件

Li *_*ong 25 javascript local-storage angularjs

我将一些数据存储在localStorage中

我在angularjs应用程序中想要的是,当localStorage中的数据发生变化时,应用程序会重新呈现应用程序,我该怎么做?

luc*_*uma 29

有一个有角度的localStorage模块:

https://github.com/grevory/angular-local-storage

var DemoCtrl = function($scope, localStorageService) {

  localStorageService.clearAll();

  $scope.$watch('localStorageDemo', function(value){
    localStorageService.add('localStorageDemo',value);
    $scope.localStorageDemoValue = localStorageService.get('localStorageDemo');
  });

  $scope.storageType = 'Local storage';

  if (!localStorageService.isSupported()) {
    $scope.storageType = 'Cookie';
  }

};
Run Code Online (Sandbox Code Playgroud)

进一步思考后,您可能需要将模块更改为在setItem上广播,以便在localStorage已更改时收到通知.也许叉和50号线:

localStorage.setItem(prefix+key, value);
$rootScope.$broadcast('LocalStorageModule.notification.setItem',{key: prefix+key, newvalue: value});  // you could broadcast the old value if you want
Run Code Online (Sandbox Code Playgroud)

或者在最近版本的库中更改了外壳

$rootScope.$broadcast('LocalStorageModule.notification.setitem',{key: prefix+key, newvalue: value}); 
Run Code Online (Sandbox Code Playgroud)

然后在您的控制器中,您可以:

$scope.$on('LocalStorageModule.notification.setItem', function(event, parameters) {
   parameters.key;  // contains the key that changed
   parameters.newvalue;  // contains the new value
});
Run Code Online (Sandbox Code Playgroud)

这是第二个选项的演示:演示:http: //beta.plnkr.co/lpAm6SZdm2oRBm4LoIi1

**更新**

我分叉了这个项目,并在你想要使用这个项目的事件中包含了这些通知:https: //github.com/sbosell/angular-local-storage/blob/master/localStorageModule.js

我相信原来的图书馆接受了我的公关.我喜欢这个库的原因是它有一个cookie备份,以防浏览器不支持本地存储.

  • 在这里,我们为+ 1做的事情.演示链接发布回答. (2认同)
  • 我继续分叉项目,并添加了通知. (2认同)
  • 我发现这个解决方案存在问题.如果本地存储变量已从在不同选项卡或检查器中运行的同一应用程序更改,则不会捕获更改事件.由于这些动作不会触发广播. (2认同)

gsk*_*lee 26

顺便说一下,我为AngularJS创建了另一个名为ngStorage的 localStorage模块:

https://github.com/gsklee/ngStorage

用法非常简单:

JavaScript的

$scope.$storage = $localStorage.$default({
    x: 42
});
Run Code Online (Sandbox Code Playgroud)

HTML

<button ng-click="$storage.x = $storage.x + 1">{{$storage.x}}</button>
Run Code Online (Sandbox Code Playgroud)

每个更改都会自动同步 - 甚至在其他浏览器标签中发生更改!

查看GitHub项目页面以获取更多演示和示例;)


agr*_*lev 5

我最近创建了一个模块,允许您简单地将localStorage键绑定到$ scope变量,还可以直接在localStorage中存储Objects,Arrays,Booleans等.

Github localStorage模块