AngularJS:如何在控制器中保持逻辑的同时更新服务属性?

时间:2016-04-24 07:32:45

标签: angularjs

典型服务可能如下所示:

(function() {
    angular.module('module').service('SomeService', SomeService);

    SomeService.$inject = ['$http'];

    function SomeService($http) {
        var service = {
            login: login,
            logout: logout,
            userState: null //object for logged in status, points etc (is there a convention for what to initialize this to?)
        }

        return service;

        login(){ //$http implementation }
        logout(){ //implementation }
    }
})();

login修改userState是有意义的,但我如何从服务中做到这一点。由于login被提升到SomeService构造函数的顶部,因此无法访问service.userState。另一种方法是放置逻辑来修改控制器中的userState ...换句话说,返回$ http登录承诺,然后让控制器将userState设置为SomeService.user.loggedIn = true,但是那会被认为是坏的,因为现在控制器确定用户是否已登录?那个逻辑不应该属于服务吗?

我能想到的一件事是使用函数表达式/ IIFE - 我不想这样做,因为这涉及将实现细节带到文件的顶部。

1 个答案:

答案 0 :(得分:1)

如果您不想将userState编辑出服务,只需要一个getter函数来获取值,如果我的理解是正确的。

(function(){     angular.module('module')。service('SomeService',SomeService);

SomeService.$inject = ['$http'];

function SomeService($http) {
    var userState = null;
    var service = {
        login: login,
        logout: logout,
        getUserState: getUserState
    }

    return service;

    function login(){ //$http implementation and you can use $promise to change userState to true here }
    function logout(){ //implementation and you can use $promise to change userState to null here }
    function getUserState(){ return userState; }
}

})();