属性 服务未更新

Property in service not updated

我的 authentication 服务有点问题。我基本上有这个服务:

angular.factory('authentication', [..., function() {
    var currentUser = {};

    return {
        login: function() {
            currentUser = { username: 'Foo' };
        },
        logout: function() {
            currentUser = {};
        }
        user: currentUser;
    }
})]

在我的 AppCtrl 中,我有这个:

 angular.module('App').controller('AppCtrl', [..., function() {
     $rootScope.$on('$stateChangeSuccess', function() {
         console.log(authentication.user);
     });
 }]);

在我的 LogoutCtrl 中,我有这个:

 angular.controller('LogoutCtrl', [..., function() {
     authentication.logout();
     $state.go('login');
 }]);

一旦状态变为login,控制台仍然打印username: 'Foo'

有什么想法吗?

angular.factory('authentication', [..., function() {
    var currentUser = {};

    return {
        login: function() {
            currentUser = { username: 'Foo' };
        },
        logout: function() {
            currentUser = {};
        }
        user: currentUser;
    }
})]

您的 login/logout 方法更改变量 currentUser 的值。这些更改不会传播到 authentication.property.

两个可能的修正:

1) 使用this.user代替var currentUser:

angular.factory('authentication', [..., function() {
    return {
        login: function() {
            this.user = { username: 'Foo' };
        },
        logout: function() {
            this.user = {};
        }
        user: {};
    }
})]

2) 实施 user 作为基于 getter 的 属性:

angular.factory('authentication', [..., function() {
    var currentUser = {};

    var auth = {
        login: function() {
            currentUser = { username: 'Foo' };
        },
        logout: function() {
            currentUser = {};
        }
    };

    Object.defineProperty(auth, 'user', {
        get: function() { return currentUser; }
    });

    return svc;
})]

当您在对象中进行第一次赋值时,您引用的是用户的引用。然后,您在调用 logout() 时替换该引用,这样您之前绑定的旧用户就不会发生变化。将其更改为 getter 函数:

...
getUser: function() {
    return user; // always the correct reference
}

现在在 console.log 中调用它,它将起作用