具有属性getter / setter的Angular Profile服务?

时间:2016-03-01 17:29:20

标签: javascript angularjs

是否可以使用带有逻辑的getter和setter的单例Angular服务?我得到了以下片段,并要求在Angular服务中模仿它。这可能听起来很简单,但我正在失去理智:

public class Profile 
{
    private AuthSvc _auth = new AuthSvc();

    private string _userId = null;
    private string _displayName = null;

    public string UserId
    {
        get 
        {
            if (_userId != null) { return _userId; }
            _userId = AuthSvc.getUserId();
            return _userId; 
        }
    }
    public string DisplayName
    {
        get 
        {
            if (_displayName != null) { return _displayName; }
            if (_userId == null) { return null; }
            _displayName = AuthSvc.getDisplayName(_userId);
            return _displayName; 
        }
        set (string value) {
            if (value == null && value.trim().length < 1) { return; }
            if (_displayName != null && _displayName == value.trim()) { return; }
            _displayName = value.trim();
            AuthSvc.setDisplayName(_userId, _displayName); 
        }
    }

}

在我开始哭泣之前尝试失败:

(function () {

    'use strict';

    angular
        .module('myapp')
        .service('Profile', ProfileService);

    ProfileService.$inject = ['common', 'dataService'];
    function ProfileService (common, dataService) {

        var userInfo = {
            id   : '',
            name : ''
        };

        var service = {
            id : $get getUserId(),
            name : $get getUserId(), $set(value, setUserId);
        };

        return service;
        /////////////////////////

        function getUserId () {
            if (!userInfo.id) { userInfo.id = common.getUserId(); }
            return userInfo.id;
        }

        function setName (value) {

        }

        function getName () {
            if (userInfo.name) { return userInfo.name; }
            var userId = getUserId();
            if (!userId) { return ''; }
            dataService.users.getDisplayName(userId).then(function(name){

            });
        }

    }

})();

2 个答案:

答案 0 :(得分:0)

您已将service写为factory

角度service是对所有属性使用this的构造函数,而factory是返回对象的函数

您应该将组件从service切换到factory

angular
    .module('myapp')
    .factory('Profile', ProfileService);

但是你也应该将函数和对象变量引用也传递给返回的对象

遵循:

  var service = {
        userInfo  : userInfo ,
        getUserId :  getUserId,
        getName : getName 
    };
  // or 
  service.myfunc = someNamedFunction;

或者将其保持为服务,将所有变量切换为this

的成员

答案 1 :(得分:0)

实际上,服务只是普通public void setEshopId(int eshopId) { eshopId = eshopId; } ,您可以在其上使用public void setEshopId(int eshopId) { this.eshopId = eshopId; } 。我使用object语法。

Object.defineProperty

你很高兴:)

使用factory语法时,所有dirrefece都是您使用(function () { 'use strict'; angular.module('mymodule', []) .factory('myService', function () { var service = {}; var userInfo = { id : '', name : '' }; serivce.getUserInfo = function(){ return userInfo;}; var myPropertyPrivateVal; Object.defineProperty(service, 'myProperty', { get: function () { return myPropertyPrivateVal; }, set: function(value) { myPropertyPrivateVal = value; } }); return service; }); })(); 而不是对象文字service

this