更新localstorage中的单个值

时间:2015-04-08 22:52:34

标签: angularjs local-storage

所以我有这段代码来更新一个人离开本地存储的日期和时间

$scope.visitorout = function(){
var dateout1 = new Date(); 
var signout = JSON.parse(localStorage["allVisitors"]);
for(var i=0;i<signout.length;i++)
if (signout[i].id===signout[i].id) signout[i].dateout = dateout1;
localStorage["allVisitors"] = JSON.stringify(signout);
}; 

但每当我调用该函数时,它会更改本地存储中每一件事的dateout的所有值,但我只希望它只更改一个

我已将代码修改为:

$scope.visitorOut = function(id){
var allVisitors = JSON.parse(localStorage["allVisitors"]);
var visitor;
for(var i=0; i<allVisitors.length; i++){
visitor = allVisitors[i];
if (allVisitors[i].id === visitor.id) {
visitor.dateout = new Date();
console.log(visitor.id)
break;
}
}
localStorage["allVisitors"] = JSON.stringify(allVisitors);

};

它会更新'dateout',但是对于localstorage中的相同项目,console.log每次都会显示相同的ID ...

<div class="list">
  <a class="item item-icon-left item-icon-right" ng-repeat="visit in visits | orderBy: '-date'" ng-click="visitorOut(id); closesignout()" ng-hide="visit.hide">
<i class="icon ion-person"></i>
{{visit.fname}} {{visit.lname}}
<i class="icon ion-log-out" ng-click="hideMe(visit)"></i>

      

2 个答案:

答案 0 :(得分:3)

此代码看起来像一个bug。您正在将对象与自身进行比较(这将始终为真):

if (signout[i].id===signout[i].id)

答案 1 :(得分:0)

此功能需要知道要更新的访问者。无论您在何处调用此函数,都需要至少传递userId(如果不是完整的用户对象),例如:$scope.visitorOut(user.id)或来自html:<myElement ng-click="visitorOut(user.id)" />

$scope.visitorOut = function(userId){
    var allVisitors = JSON.parse(localStorage["allVisitors"]);
    var visitor;
    for(var i=0; i<allVisitors.length; i++){
        visitor = allVisitors[i];
        if (visitor.id === userId) {
            visitor.dateout = Date.now();
            break;
        }
    }
    localStorage["allVisitors"] = JSON.stringify(signout);
};

请注意,我在这里使用了Date.now()而不是new Date()。如果要对其进行字符串化,则使用时间戳比使用日期更容易。时间戳可以转换为这样的日期:

var myDate = new Date(visitor.dateOut);

但是如果你想将字符串化的日期转换回Date对象...... it gets complicated (click)


我也改变了一些变量名。 Camelcase是一个有用的命名约定,它有助于提高可读性,而且从读取其余代码开始,signout变量实际上似乎是visitor个对象的数组,而不是一个注销数组,所以我也重命名了