angularjs:服务中的变量不为服务或控制器更新

时间:2014-02-08 00:57:13

标签: angularjs

JavaScript和AngularJS对我来说还是新手。

我无法将服务中的变量放入我的范围。这就是我正在做的事情:

myControllers.controller('UserController', function($scope, UserService) {

    clearLoginForm();
    updateStuff();
    $scope.notifications = UserService.notifications;

    function updateStuff() {
        $scope.realName = UserService.realName;
        $scope.loggedIn = UserService.loggedIn;
    }

    function clearLoginForm() {
        $scope.loginName = '';
        $scope.loginPassword = '';
    }

    $scope.login = function() {
        UserService.login($scope.loginName,$scope.loginPassword);
        updateStuff();
        clearLoginForm();
    }

    $scope.logout = function() {
        UserService.logout();
        updateStuff();
        clearLoginForm();
    }

});

UserService应该保存有关登录用户的信息以及登录/注销功能以及应该从服务器轮询的帐户相关内容。

myModule.factory('UserService', function($interval) {

      var loggedIn = false;
      var realName = "";
      var notifications = {};
      resetNotifications();

      function resetNotifications() {
          notifications.msgCount = 0;
          notifications.todoCount = 0;
          notifications.ergCount = 0;
      }

      function login(name, password) {
          if (password === 'abc') {
              loggedIn = true;
              realName = 'John Smith';
          }
      };

      function logout() {
          loggedIn = false;
          realName = '';
          resetNotifications();
      }


      function updateNotifications() {
          if (loggedIn) {
              notifications.msgCount = 1;
          }
          else {
              resetNotifications();
          }
      };

      $interval(updateNotifications, 10000);

      return {
          loggedIn : loggedIn,
          realName : realName,
          login : login,
          logout : logout,
          notifications : notifications
      };
  });

但它不起作用。所以我注意到如果我将登录/注销函数中的“loggedIn”更改为“this.loggedIn”(与realName相同),则值会传播到范围。为什么我需要“这个”?在我的关闭中不是“loggedIn”和“realName”吗?但这不是一个解决方案,因为现在它与updateNotifications函数中使用的“loggedIn”不同(在这里我无法将其更改为“this.loggedIn”)。

其次,我不喜欢每次服务中的值发生变化时都需要调用updateStuff()函数。但它没有用。有没有更好的方法呢?

我担心我做的事情本质上是错误的。

2 个答案:

答案 0 :(得分:4)

当您在服务结束时返回loggedIn时,您真正返回的是该变量的副本。因此,当您稍后在UserService内部更新它时,副本不会更新。解决这个问题的最简单方法是使用getter方法:

function getLoggedIn() { return loggedIn; }

return {
    getLoggedIn: getLoggedIn
};

答案 1 :(得分:2)

你的回答有所帮助。但我发现了一个更好的方法。我只是将logIn和realName包装在一个真实对象中

var userStatus = {
        loggedIn : false,
        realName : ""
      };

并在控制器中使用那个。这也消除了updateStuff函数的必要性。我希望这不会造成任何其他麻烦。