我有一个范围函数,它返回一个从本地存储器获取的对象(采用JSON格式)(使用此服务https://github.com/grevory/angular-local-storage):
$scope.getLsKeys = function(){
$scope.lsKeys = localStorageService.get('accountKeys');
return $scope.lsKeys;
};
我想用ng-repeat迭代返回对象的属性,如下所示:
<button ng-click="console.log(key)" ng-repeat="item in getLsKeys()"></button>
问题在于,由于getLsKeys / localStorageService在每个摘要周期都返回一个新对象,因此Angular对它应该观察的对象感到困惑,因为它认为它之前从未见过该对象(技术上是真的)。错误消息是:
Uncaught Error: [$rootScope:infdig] 10 $digest() iterations reached. Aborting!
Watchers fired in the last 5 iterations: [["fn: $watchCollectionWatch; newVal: 81; oldVal: 79"],["fn: $watchCollectionWatch; newVal: 83; oldVal: 81"],["fn: $watchCollectionWatch; newVal: 85; oldVal: 83"],["fn: $watchCollectionWatch; newVal: 87; oldVal: 85"],["fn: $watchCollectionWatch; newVal: 89; oldVal: 87"]]
所有在ng-repeat中使用“track by”的尝试都失败了,因为集合存储为一个对象,而不是一个数组(遗憾的是我无法更改我的同事代码来进行更改)。有没有办法轻松解决这个问题?
我提出的唯一解决方案是迭代$ scope.lsKeys而只是在修改本地存储时更新它,但这实际上违背了Angular的整个目的。
编辑:本地存储在应用程序运行时期间被修改,需要由Angular读取;也就是说,需要在运行时调用getLsKeys,而不仅仅是初始化。
答案 0 :(得分:0)
您可以使用ng-init
填充范围对象:
<button ng-repeat="item in lsKeys" ng-init="lsKeys = getLsKeys()"></button>