AngularJS Service Singleton用法?

时间:2016-03-14 18:36:46

标签: angularjs

我需要一个在应用程序生命周期内保持实例化的服务,并提供基本属性,类似于C#语法。例如,如果我创建了一个profile服务,我希望使用以下语法从我的控制器中获取并设置User;

activate();

function activate() {
    vm.user = profile.user;
}

function login (user, pass) {
    api.login(user, pass)
        .then(function(response){
            profile.user = response.data;
            vm.user = profile.
        });
}

以下示例是否正确?..

(function () {

    'use strict';

    angular
        .module('blocks.auth')
        .service('profile', profileService);

    profileService.$inject = [];
    function profileService () {

        this._user;

        this.user = {
            get function () {
                return this._user;
            },
            set function (value) {
                this._user = value;
            }
        };

    }

})();

很抱歉新手问题,但服务上的语法看起来非常古怪和令人困惑。

2 个答案:

答案 0 :(得分:3)

还来自C#/ .NET,我想我知道你头脑中有什么问题。你的大脑可能还在考虑你曾经看过的范围和变量定义。

以下是我如何构建您的服务:

(function () {

    'use strict';

    angular
        .module('blocks.auth')
        .factory('profile', profileService);

    function profileService () {

        var _user = {};

        var service = {

            // User (read / write)
            get user () {
                _user = _user || {};
                return _user;
            },
            set user (value) {
                if (value && !value.id) { return; }
                _user = value || {};
            },

            // isUserLoaded (read only ... no setter)
            get isUserLoaded () {
                return (_user && _user.id != null);
            },

            // Clear (similar to class method)
            clear : function () {
                _user = {};
            }

        };

        return service;
    }

})();

service对象视为C#中的class。这仍然使用您的下划线作为局部变量,因此您可以更好地看到它。哎呀,如果你想更接近地模仿C#类,你也可以将_user变量移动到service对象中。然后,get个和set个几乎完全相同。

唯一奇怪的是我添加的clear()函数...主要是因为语法。

答案 1 :(得分:1)

是的,角度服务是单身。只需确保将服务注入控制器即可。

下面的内容(未经测试):

str