角度服务变量没有更新

我有以下服务(伪代码)

app.service('user', function($http) {
    function login(email, password, callback) {
        // login user
        // set isLoggedIn to true
        // assign the returned user object to userData
        // issue callback
    };

    return {
        isLoggedIn: false,
        userData: null,
        login: login
    };
});

这是我的登录控制器:

app.controller('LoginController', function($scope, $http, $location, user) {
    user.login($scope.email, $scope.password, function(isSuccess, data, status) {
        if (isSuccess) { $scope.onSuccessfulLogin(); }
        else { $scope.loginStatusMessage = data; }
    });

    $scope.onSuccessfulLogin = function() {
        $location.path('/someOtherPage');
    };
});

这里是/someOtherPage使用的控制器

app.controller('SomeOtherPageController', function($scope, $http, $modal, user) {
    // lots of stuff in here
    // I put a breakpoint on the first line and user.isLoggedIn is false
    // even though it was definitely set to true when the user logged in.
)};

一旦使用user服务登录时发出回调,如果登录成功,用户将被带到不同的控制器的页面,其中上述user服务被注入。 问题是,如果登录成功,虽然我可以看到isLoggedInuserData变量被正确赋值,但在新的控制器中,它们分别保持为falsenull

我在这里错过了什么吗? 每当user像单身人士注入时,我需要的值是相同的。

谢谢


您需要使用服务,而不是工厂。 服务是返回你的函数的一个实例。 这意味着一旦注入每个人都将使用相同的实例。 在你的情况下,你正在使用一个工厂(自从我发布我的答案以来,你已经更新了它),并且每次注入它时都会返回从该函数返回的值。 在这里最好的SO帖子是在这里AngularJS:服务vs提供者vs工厂

当我想把这点指向家庭时,我倾向于使用服务。 我希望人们知道他们是否注入了这些,每个人都将分享同一个对象。 我经常将它与Cache和用户一起使用。

app.service('user', function($http) {
    var that = this;

    this.isLoggedIn = false;
    this.login = function(email, password, callback) {
       that.isLoggedIn = true;
       // login user
       // set isLoggedIn to true
       // assign the returned user object to userData
       // issue callback
    };
    return this;
})

这里的问题是你正在返回一个用null和false实例化的对象:

return {
        isLoggedIn: false,
        userData: null,
        login: login
    };

它应该返回另一个闭包变量。

 return {
            isLoggedIn: myIsLoggedIn,
            userData: myUserData,
            login: login
        };

myUserDatamyIsLoggedInlogin功能中设置。 或者另一条路线是返回返回这些值的方法,如@Sten提到的那样。


实际上,角度上的所有服务都是单例。 检查此stackoverflow更多信息。 任何人,直接从你的问题,这直接从Angular文档:

有角服务有:

Lazily实例化 - Angular只在应用程序组件依赖它时实例化一个服务。

单身 - 依赖于服务的每个组件获取对由服务工厂生成的单个实例的引用。

你应该使用一个工厂,因为你只需要重新创建揭示模块模式,Angular在工厂实现,该服务是一个构造函数。

除了这两点之外,您的服务仅仅为这两个值返回null和false,无论您在服务中如何将其更改为内部值,这些值都始终为null和false。 您正在返回一个对象,因此您需要正确连接键值对。

app.factory('user', function($http) {
    var service = {};

    service.userData = null;
    service.isLoggedIn = false;
    service.login = function(email, password, callback) {
        // login user
        // set isLoggedIn to true
        this.isLoggedIn = true;
        // assign the returned user object to userData
        this.userData = someValue;
        // issue callback
    } 

    return service;

});
链接地址: http://www.djcxy.com/p/77829.html

上一篇: Angular service variables not updating

下一篇: AngularJS services vs factory advantages and shortcomings