关于angularjs:更新localstorage中的单个值

updating a single value in localstorage

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

1
2
3
4
5
6
7
$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值,但我只希望它更改一个值。

我已经将代码修改为:

1
2
3
4
5
6
7
8
9
10
11
12
$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…

1
2
3
<i class="icon ion-person">
{{visit.fname}} {{visit.lname}}
<i class="icon ion-log-out" ng-click="hideMe(visit)">


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

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


此函数需要知道要更新哪个访问者。无论您在何处调用此函数,都需要至少传入userid(如果不是完整的user对象),比如:$scope.visitorOut(user.id)或html:之类的内容。

1
2
3
4
5
6
7
8
9
10
11
12
$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()。使用时间戳比使用日期要容易得多,如果你想把它串起来的话。时间戳可以转换为如下日期:

1
var myDate = new Date(visitor.dateOut);

但是,如果您想将字符串化的日期转换回日期对象…它变得复杂(点击)。

我还稍微改变了变量名。camelcase是一种有用的命名约定,它有助于提高可读性,从读取代码的其余部分来看,signout变量实际上似乎是visitor对象的数组,而不是注销的数组,因此我也将其重命名。