是否可以使用带有逻辑的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){
});
}
}
})();
答案 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