$ scope。$ watch不保持两个控制器同步?

时间:2015-02-07 04:02:00

标签: angularjs

我有一个用户服务检索的用户对象。我想知道在我的应用程序中保持对此User对象的所有引用同步的最佳方法。 (即不同的控制器),不使用UI提供程序。

我认为只是通过使用工厂来引用,但什么也没发生。

这是我的工厂

angular.module('app').factory('userFactory', function ($http) {
    function login (username, password) {
      return $http.post('/login/login', {
        username: username,
        password: password
      }).then(function success (response) {
        return response.data;
      })
})

    var user = {
      login: login
    };


    return user;

这是一个控制器:

angular.module('app')
  .controller('LoginCtrl', function ($scope, $location, UserFactory) {

    $scope.login = function (username, password) {
      UserFactory.login(username, password).then(function success (response) {
        $scope.user = response.user;
      });
    };

我的第二个控制器:

angular.module('app')
  .controller('HeadCtrl', function ($scope, $location, UserFactory) {

    $scope.login = function (username, password) {
      UserFactory.login(username, password).then(function success (response) {
        $scope.user = response.user;
      });
    };

因此,如果在我的应用程序中同时使用其中的每一个,我如何确保$ scope.user在两者之间完全相同。 (那么,如果我通过一个控制器登录,登录状态会在第二个控制器中发生变化吗?

我在每个控制器中尝试了这个:

$scope.$watch('user', function (newVal, oldVal) {
  console.log('Something changed');
}, true);

但它也没有用。

1 个答案:

答案 0 :(得分:0)

将登录用户存储在UserFactory中,以便可以在多个控制器之间共享。

angular.module('app').factory('UserFactory', function ($http) {
  var user = {
    currentUser: null,
    login: login
  };

  return user;

  function login (username, password) {
    return $http.post('/login/login', {
      username: username,
      password: password
    }).then(function success (response) {
      user.currentUser = response.data;
      return user.currentUser;
    });
  }
}

然后,观察工厂的属性并将其与控制器中的$scope同步。

$scope.user = UserFactory.currentUser;
$scope.$watch(function () {
  return UserFactory.currentUser;
}, function () {
  $scope.user = UserFactory.currentUser;
});

$scope.login = function (username, password) {
  UserFactory.login(username, password);
};