【问题标题】:angularjs override service setter and getterangularjs 覆盖服务设置器和获取器
【发布时间】:2015-01-30 02:46:05
【问题描述】:

我是 JS 和 Angular 的新手, 我有一个 currentUser 角度服务...它应该将检索到的当前用户设置为 localStorage 以在页面刷新之间保持它

服务定义如下

var currentUserSrvc = function() {
  // some logic on how to save the user to localStorage
  return {
    user: {}
  };
};
angular.module('app').factory('currentUser', currentUserSrvc);

我想覆盖此服务的 setter 和 getter 以使用 localStorage... 但不手动添加 setter 和 getter

不要介意 localStorage 内部如何工作

// I just want to use it like
currentUser.user = response.user
// instead of using it like (given that I'll provide a setter and a getter methods)
currentUser.setUser(response.user)

使用 Angular js 可以吗?

【问题讨论】:

  • 所以你想在这个服务中添加一个 $watcher 来观察用户的变化,对吧?
  • 不,我想覆盖服务中的 setter 和 getter,以允许在其中注入额外的逻辑。
  • 不幸的是,在 javascript 中没有属性的内部 setter/getter(像某些语言一样),你必须添加一个 $watcher 来观察属性的变化(就像 angularjs 一样)
  • service.__proto__ 有以下方法 __defineGetter__ __defineSetter__ __lookupGetter__ __lookupSetter__ ... 当currentUser.user = ... 时使用那些作为setter 和getter 的不是angular?!跨度>

标签: javascript angularjs angular-services angularjs-factory


【解决方案1】:

这是你要找的吗?

var currentUserSrvc = function() {
  // some logic on how to save the user to localStorage

  return {
     get user() {return localStorage.user;},
     set setUser(user) {localStorage.user = user}
  };
};
angular.module('app').factory('currentUser', currentUserSrvc);

这是您在 javascript 中使用 getter 和 setter 的方式:

所以你会:

currentUser.user //retrieves localStorage.user
currentUser.setUser = "myUser" //sets localStorage.user to "myUser"

编辑:您也可以这样做。

var currentUserSrvc = function() {
  var currentUser = {}
  Object.defineProperty(currentUser, "user", {
    get: function() {return localStorage.user; },
    set: function(user) { localStorage.user = user; }
  })

  return currentUser;
};
angular.module('app').factory('currentUser', currentUserSrvc);

所以你会:

currentUser.user //retrieves localStorage.user
currentUser.user = "myUser" //sets localStorage.user to "myUser"

EDIT2:或者你甚至可以这样做:

var currentUserSrvc = function() {
  // some logic on how to save the user to localStorage

  return {
     get user() {return localStorage.user;},
     set user(user) {localStorage.user = user}
  };
};
angular.module('app').factory('currentUser', currentUserSrvc);

【讨论】:

  • 我正在使用咖啡脚本,因此第一个和最后一个解决方案都无法应用...并且第二个解决方案有效...但是当我向其中添加日志时,我注意到 currentUser.user = { someObject } 已登录1 个 setter 调用和 3 个 getter 调用?!
  • 我已将其标记为答案,尽管我不明白为什么像currentUser.user = { name: 'name', title: 'title', email: 'email' } 一样使用它时会调用 1 个 setter 和 3 个 getter ?!
  • @artmees 不确定,当我运行“currentUser.user = { name: 'name', title: 'title', email: '电子邮件'}”在控制台中。
猜你喜欢
  • 2014-03-11
  • 2013-05-17
  • 2015-10-12
  • 2014-10-16
  • 2013-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多