AngularJS工厂 - 从方法中访问私有变量

时间:2016-11-12 08:40:55

标签: angularjs factory

我写了以下工厂:

.factory('UserFact', function() {
  var user = [];
  return {
  'setUser': function(user) {
    this.user = user;
      console.log('(1) User set: ' + this.user);
      console.log('(2) User id is now: ' + this.user.uid);
  },
  'updateSport': function(sportid) {
    console.log('(3)Update sport ' + sportid + 'for user id ' + this.user.uid);
  }
}

在我的控制器中使用以下方式:

function ($scope, $stateParams, DatabaseFact, UserFact) {

  // variables
  $scope.sports = [];
  $scope.sports = DatabaseFact.getSports();

  // functions
  $scope.updateSport = UserFact.updateSport;

  // execution
  UserFact.setUser({uid: '123456', name: 'forrest'});
}

通过触发按钮列表从我的视图中触发它:

updateSport(sport.id)

我的问题是控制台日志会打印以下内容:

(1) User set: [Object] Object
(2) User id is now: 123456
(3) Update sport 1 for user id undefined

您知道为什么我的用户ID在日志3中未定义吗?

由于

3 个答案:

答案 0 :(得分:1)

由于其实施的原因,这对我有意义。在您的控制器中,您实际上是将方法引用复制到$ scope.updateSport。因此,无论何时执行该方法,它都会在控制器的上下文中执行,并且这个 - > $ scope实例,但不是服务实例。

由于你的控制器doenst有uid,它只返回undefined。

要解决这个问题,你需要有一个updateSort方法体并调用UserFact.updateSport

$scope.updateSport = function(){
    UserFact.updateSport();
}

答案 1 :(得分:0)

它未定义,因为您的函数使用this,但是从其原始对象(用户服务)复制到范围。

您可以停止使用this,而是使用您声明并初始化为空数组的user变量(为什么,BTW?),但从未在其他任何地方使用过,或者< / p>

$scope.updateSport = function() {
    UserFact.updateSport;
}

请注意,您已将服务命名为&#34; UserFact&#34;,但它不是一个设备。它没有创造任何东西。它只允许设置用户并更新其运动。那不是工厂。工厂是用于创建事物的对象。这里的工厂是传递给module.factory()的函数,它用于创建和返回服务实例,最好称为UserService

答案 2 :(得分:0)

我不知道您对JavaScript的熟悉程度,但我怀疑您的两个函数调用中的this引用有所不同。

要调试此操作,请尝试在两个函数中将this记录到控制台。您应该观察它们的不同,这可以解释您的问题的原因。

修复可能是不使用this关键字,例如函数setUser将成为:

'setUser': function(_user) {
    user = _user;
}

您可以在Google上找到有关JS this的更多信息,首先尝试https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Operators/this