【问题标题】:AngularJs - keeps getting old value of scope even if it is updatedAngularJs - 即使它被更新,它也会保持旧的范围值
【发布时间】:2017-08-22 08:16:24
【问题描述】:

在我的应用程序中,当用户登录时,我正在从数据库中检索一些字段并在本地存储中设置值。

然后从本地存储中检索并显示给用户:

if (localStorage.getItem('a') != undefined) {
            $rootScope.a = localStorage.getItem('a');
    }

所以这工作正常。但是问题是当数据库中的值更新并且用户在注销后登录时,即使本地存储具有正确的值(即最近更新的值),它也会第一次显示范围变量的旧值刚刚更新。

我尝试了$apply()$digest(),正如这里不同帖子中所建议的那样:

$timeout( function () {
        $scope.$apply( function () {
            $rootScope.a = localStorage.getItem('a');
        });
    });

但是没有成功。它始终显示范围的旧值。 它只会在重新加载一次页面后显示新值。

附: - 我的应用程序中的网页不会在任何模块中重新加载,即使在登录和退出时也是如此。

【问题讨论】:

    标签: angularjs


    【解决方案1】:

    您可以尝试像这样查看范围变量:

    $rootScope.$watch('a', function (newVal, oldVal){
     if newVal != oldVal
       $rootScope.a = newVal;
    }
    

    要尝试的其他方法是将“a”从字符串更改为对象,因为我认为 angular 使用对象引用来监视值。

    这里有一些关于 $watch 的有用参考

    http://www.learn-angular.org/#!/lessons/watch

    https://www.bennadel.com/blog/2852-understanding-how-to-use-scope-watch-with-controller-as-in-angularjs.htm

    希望对您有所帮助

    编辑

    好的,我测试过了。如果在数据刷新时刷新范围,则不需要 watch 也不需要 $apply。

    这是我所做的:

    (function() {
      angular.module('myapp', []).controller('myctrl', [
        '$scope', function($scope) {
          var data, getDataFromLocalStorage;
          console.log("scope is ", $scope);
          getDataFromLocalStorage = function() {
            return JSON.parse(localStorage.getItem('data'));
          };
          data = [
            {
              id: 1,
              text: "test1"
            }, {
              id: 2,
              text: "test2"
            }, {
              id: 3,
              text: "test3"
            }
          ];
          localStorage.setItem('data', JSON.stringify(data));
          $scope.myData = getDataFromLocalStorage();
          return $scope.changeData = function() {
            var dataNew;
            dataNew = [
              {
                id: 4,
                text: 'text4'
              }, {
                id: 5,
                text: 'text5'
              }, {
                id: 6,
                text: 'text6'
              }
            ];
            localStorage.setItem('data', JSON.stringify(dataNew));
            return $scope.myData = getDataFromLocalStorage();
          };
        }
      ]);
    
    }).call(this);
    

    https://codepen.io/NickHG/pen/rzvGGx?editors=1010

    【讨论】:

    • 我应该删除$apply 吗?
    • 我从不使用 apply。手表已经运行它,所以回答你的问题是的,我认为你不需要它。基本上使用一个对象并观察它应该可以解决问题,因为这通常是我所做的
    • Here 你有一个关于$watch$apply$digest 的很好的教程
    • 所以我必须在注销时清除本地存储,对吧?
    • 会更好,是的。你注销,。清除存储(如果需要,可以将数据保存在数据库中),然后当新用户重新登录时,您检索数据并更新范围。在用户注销时保存数据我认为无论如何都不是安全的最佳做法
    猜你喜欢
    • 1970-01-01
    • 2015-07-05
    • 2014-09-01
    • 1970-01-01
    • 2021-12-27
    • 2018-08-26
    • 2011-06-25
    • 1970-01-01
    • 2016-10-06
    相关资源
    最近更新 更多