我正在使用Ionic Framework应用。我已经安装了LocalForage,我已决定将其用作我的本地存储解决方案,用于离线存储。
以下是我的app.js配置中的LocalForage设置:
$localForageProvider.config({
driver : 'localStorageWrapper',
name : 'myApp',
storeName : 'keyvaluepairs',
description : 'some description'
});
$localForageProvider.setNotify(true, true); // itemSet, itemRemove
接下来,我创建了一个"表"使用我的services.js文件中的以下代码存储我的信息:
dataFactory.getUserProjects = function(){
return $http.get(baseURL + 'getUserProjects.cfm').then(function(response) {
// store locally so that we can access when we are offline
return $localForage.setItem('userprojects', response.data).then(function() {
//console.log("userprojects: ", response.data);
return response.data;
});
}, function() {
// the error indicates that we are offline -> get the locally stored list
console.log("catch failed, get it locally");
return $localForage.getItem('userprojects').then(function(item) {
return item;
});
});
};
接下来,我在控制器中调用该函数:
HoursService.getUserProjects().then(function(response){
$scope.tags = response;
});
此页面是Master-Detail模式的Master页面。在详细信息页面上,我再次"得到" $ localForage对象并向下迭代以获取我需要在Detail页面上显示的单个文件:
// Get the userprojects and iterate through them to find the one we need
HoursService.getUserProjects().then(function(response){
var data = response;
angular.forEach(data, function(value, key){
angular.forEach(value.Activity, function(value, key){
if(value.RecordID == $rootScope.pageID){
$scope.singleRecord = value;
}
});
});
});
好的,这一切都很棒!问题是当我尝试更新“用户项目”时。 JSON对象。我使用ng-click调用并执行此函数:
$scope.updateHours = function(index, id){
console.log("I clicked delete");
console.log("Index:" + $rootScope.outerID + ", " + "ID: " + $rootScope.pageID);
$localForage.getItem('userprojects').then(function(item){
console.log("My Item:", item);
$scope.item = item;
$scope.path = $scope.item[$rootScope.outerID].Activity[$rootScope.innerID];
$scope.path.ActivityName = 'Magic Dolphin Event';
$rootScope.$broadcast('LocalForageModule.setItem', {
key: $scope.path,
newvalue: $scope.path.ActivityName,
driver: $localForage.driver
});
$state.go("tab.projects", {}, {reload: true});
});
};
如果我设置了一个" console.log"在运行Broadcast事件后检查对象,我可以看到正确的字段已更新并成为" Magic Dolphin Event"。好的,太棒了!
问题是当我导航或使用" $ state.go"将BACK重定向到Master页面。核心对象不会更新,如果我设置了console.log,则调用$ localForage.getItem:" userprojects",然后看,它没有更新。我检查了我的代码,我只设置了" userprojects"对象一次,在工厂里。我一次又一次地浏览文档并运行我能想到的每一个搜索,并且没有任何运气。我是一个Angularjs newb,我怀疑我没有理解某些东西,或者忽略或误解了某些东西。任何帮助表示赞赏。我做错了什么?
答案 0 :(得分:0)
理解这个问题的关键是确定您对应用程序的内存状态所做的隐藏假设。您假设通过Detail控制器修改的Activity
实例与将通过主控制器显示的实例相同。这个假设是错误的。对象可能看起来相同,因为它们来自同一个源,但它们实际上是不同的实例;更新一个不会导致另一个改变。有关演示,请参阅this jsfiddle。
要解决此问题,只需在从详细信息控制器调用$localforage.setItem
之前,使用更新的对象图调用$state.go
。实际上,您的代码完全放弃了更新后的对象图 。进行此更改将确保您对$localforage.getItem
的下一次调用将获得您期望的数据。
附注:您最好将所有$localforage
操作放在HoursService
的某些方法后面。不要使用服务层的实现细节污染控制器!
这有帮助吗?