【问题标题】:AngularJS LocalForage CRUD Creation ProblemsAngularJS LocalForage CRUD 创建问题
【发布时间】:2015-12-17 19:54:00
【问题描述】:

我正在开发一个 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;
        });
    });
};

接下来,我在 Controller 中调用该函数:

HoursService.getUserProjects().then(function(response){
        $scope.tags = response;
});

此页面是主从模式的主页面。在详细信息页面上,我再次“获取” $localForage 对象并向下迭代以获取我需要在详细信息页面上显示的单个文件:

// 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;
            }
        });
    });
});

好的,这一切都很好!问题是当我尝试更新 'userprojects' 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”来检查对象,我可以看到正确的字段已更新并变为“Magic Dolphin Event”。好的,太好了!

问题是当我导航或使用“$state.go”重定向回母版页时。核心对象没有更新,如果我设置了一个console.log,调用$localForage.getItem:“userprojects”,看,它没有更新。我检查了我的代码,我只在工厂中设置了一次“userprojects”对象。我一遍又一遍地查看文档并运行所有我能想到的搜索并且没有任何运气。我是 Angularjs 新手,我怀疑我不理解某些东西,或者忽略或误解了某些东西。任何帮助表示赞赏。我做错了什么?

【问题讨论】:

    标签: javascript angularjs ionic-framework localforage


    【解决方案1】:

    理解这里问题的关键是找出你对应用程序的内存状态所做的隐藏假设。您假设您通过 Detail 控制器修改的 Activity 实例与将通过 Master 控制器显示的实例相同。这个假设是错误的。这些对象可能看起来相同,因为它们来自同一来源,但实际上它们是不同的实例;更新一个不会导致另一个改变。请参阅this jsfiddle 进行演示。

    要解决此问题,只需使用更新的对象图调用$localforage.setItem之前从 Detail 控制器调用 $state.go。事实上,您的代码完全放弃了更新的对象图。进行此更改将确保您下次致电$localforage.getItem 将获得您期望的数据。

    旁注:最好将所有$localforage 操作放在HoursService 上的某个方法后面。不要让你的服务层的实现细节污染你的控制器!

    这有帮助吗?

    【讨论】:

    • 嘿乔恩 - 非常感谢!!!昨晚我再次敲定它,我意识到这很可能是问题所在!今天检查 SO 真是太好了,看到我是对的!!!您在这里解释的方式也非常清晰和有帮助! :D
    猜你喜欢
    • 1970-01-01
    • 2014-04-18
    • 2016-07-14
    • 1970-01-01
    • 2015-06-20
    • 1970-01-01
    • 1970-01-01
    • 2021-01-01
    • 1970-01-01
    相关资源
    最近更新 更多