【问题标题】:updating a single value in localstorage更新本地存储中的单个值
【发布时间】:2015-06-14 02:56:48
【问题描述】:

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

$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>

【问题讨论】:

  • 此代码中没有任何内容表明您要更新哪个访问者的signout
  • 好的,我明白你的意思了。每个访问者都有一个唯一的 ID,它是由“Math.random”生成的随机数,如果我想记录访问者在点击他们的名字时离开的日期,我将如何修改代码?谢谢
  • 既然我知道你想要做什么,我会作为答案回复。

标签: angularjs local-storage


【解决方案1】:

此代码看起来像一个错误。您正在将一个对象与其自身进行比较(这将始终是正确的):

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

【讨论】:

  • 那你建议我怎么做?
  • 您似乎正在尝试在注销数组中查找特定元素。您要查找哪个元素?某处是否有代表您要查找的项目的变量?假设该变量名为 targetSignoutId,将代码更改为 if(signout[i].id === targetSignoutId)
  • 是的,我正在尝试查找用户登录后随机生成的每个访问者的 ID。一旦访问者在退出页面上点击他们的姓名,我如何找到该 ID?登出页面显示每个访问者的姓名,并通过 ng-click 调用“visitorout”函数。谢谢
  • 如何定义 targetSignoutId 变量?
【解决方案2】:

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

$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 对象数组,而不是一个注销数组,所以我也重命名了它。

【讨论】:

  • 它根本没有更新本地存储
  • 您又犯了同样的错误,将每个访问者与自己进行比较。将此:if (allVisitors[i].id === visitor.id) 更改为:if (visitor.id === id)
  • 我似乎无法让它工作。你认为 HTML 有问题吗?
  • 是的,有。 visitorOut(id) 应该是 visitorOut(visitor.id)。查看所有代码和 html,查看每个变量,将其写下来,并确保您知道每个变量的来源。慢慢来,如果有帮助就把它们写下来。我强烈建议您学习如何使用调试器。如果您要在该函数的任何位置设置断点,您会看到 id 未定义。
猜你喜欢
  • 2023-03-18
  • 2018-02-18
  • 2016-05-14
  • 2014-03-22
  • 2020-10-27
  • 2020-07-07
  • 1970-01-01
  • 2014-09-06
  • 1970-01-01
相关资源
最近更新 更多