【发布时间】:2013-12-03 05:49:14
【问题描述】:
在我看来,我想显示保存在 LocalStorage 元素中的项目列表(主题名称)。我在视图中的代码如下所示:
<div class="list">
<a class="item" href="#" ng-repeat="subject in subjects">
{{subject.name}}
</a>
</div>
我的控制器如下所示:
.controller('SubjectCtrl', function ( $scope ) {
$scope.subjects = store.get('subjects');
$scope.submit = function() {
if (store.get('subjects') != null) {
var existing = store.get('subjects')
var subject = [ { name: $scope.form.name, weighting: $scope.form.weighting, grades: [] } ]
subject.add(existing)
store.set('subjects', subject)
}
else {
var subject = [ { name: $scope.form.name, weighting: $scope.form.weighting, grades: [] } ]
store.set('subjects', subject)
}
};
})
$scope.subjects 变量使用 Store.js(https://github.com/marcuswestin/store.js,一种简化 LocalStorage 访问的插件)从 LocalStorage 中获取项目并将它们提供给视图。
当用户提交表单以添加新主题时,会触发下面的代码。该表单包含两个输入:名称和权重。提交表单时,代码会检查 LocalStorage 对象“主题”中是否已经存在任何主题。如果是,则将新主题添加到主题数组中并更新 LocalStorage。如果没有,则会创建一个名为“subjects”的 LocalStorage 对象并添加新的主题。
上面的代码按预期工作,但我的大问题是,如果将新主题添加到 LocalStorage 内的数组中,Angular 不会更新视图,我必须重新加载页面手动查看列表中出现的新主题。
经过一番研究,我了解到问题可能是因为 LocalStorage 对象在 AngularJS 范围之外更新。但我是 Angular 初学者,不知道在对象发生变化时立即通知 Angular 的最佳方式是什么。
感谢您的帮助!
-- 更新--
我已从 store.js(不能与 angular 一起使用)切换到 ngStorage (https://github.com/gsklee/ngStorage)。如果我使用 ngStorage 发布更新的控制器代码,也许对某人有帮助:
.controller('SubjectCtrl', function ( $scope, $localStorage ) {
$scope.$localStorage = $localStorage.$default({
subjects: []
});
$scope.subjects = $localStorage.subjects;
$scope.submit = function() {
$localStorage.subjects.push({ name: $scope.form.name, weighting: $scope.form.weighting, grades: [] });
};
})
【问题讨论】:
-
$scope.$apply();是否强制更新您的情况? -
@Shomz 不需要也无济于事,因为
$scope.subjects没有更新。在角度范围函数内更新范围时不需要$apply -
@Giannizz 最大的问题是你首先想到的是 localStore .....想想其他方式,所以 store 反映了你在范围内所做的更改,除了在你需要时首次加载控制器检索本地数据。处理服务器更新时略有不同...需要先确认服务器连接
-
@charlietfl 你说得对,不知道为什么我认为这些更改来自外部来源......
-
感谢大家的回答并为我提供了有关如何解决此问题的解决方案 :) 我尝试了下面提出的解决方案 artur,但即使它是范围也没有任何效果-first-localStorage-last-approach。你知道为什么他的代码不起作用吗?我现在真的很困惑
标签: javascript angularjs local-storage angularjs-ng-repeat