【问题标题】:Angular factory access method within factory with this. and I get undefined function工厂内的角度工厂访问方法。我得到未定义的功能
【发布时间】:2015-02-05 13:53:55
【问题描述】:

大家好,我在使用 Angular 工厂时遇到了一些问题。试图从工厂调用我的控制器中的一个函数,该函数使用this 调用同一工厂内的另一个函数。但我总是得到控制台“错误未定义不是函数”

angular.module('psJwtApp').factory('authToken', function ($window) {
  var storage = $window.localStorage;
  var cachedToken;
  return {
    setToken: function(token){
      cachedToken = token;
      storage.setItem('userToken', token);
    },
    getToken: function(){
      if(!cachedToken) 
        {cachedToken = storage.getItem('userToken');}

        return cachedToken; 
    },
    isAuthenticated: function() {
      return !!self.getToken();

    }
  };
});

然后我在我的角度控制器中调用它:

angular.module('psJwtApp').controller('HeaderCtrl', function ($scope, authToken) {
  $scope.isAuthenticated = authToken.isAuthenticated; 
});

非常感谢任何帮助。我尝试将getToken 称为thisselfauthToken.getToken。没有。如果我安慰authToken.getToken,我会得到undefined。任何想法可能会发生什么?

【问题讨论】:

  • var self=this 在哪里?也许你忘了?
  • 我认为问题之一是您在方法调用结束时缺少()$scope.isAuthenticated = authToken.isAuthenticated();
  • @ViníciusGobboA.deOliveira 感谢您的建议,当我将其声明为 authToken.isAuthenticated();我仍然得到 undefined is not a function.
  • @anvarik sorry var self=this 也给了我未定义的功能。如果我在我的 ctrl 上将其声明为 authToken.isAuthenticated(); chrome 将错误指向控制器。如果我声明为 authToken.isAuthenticated 并执行 this.IsAuthenticated,则 chrome 指向实际的工厂文件以及我调用 this.isAuthenticated 或 self..isAuthenticated 的行。即使将 var self 设置为此
  • @jsrosas 你应该可以使用this.getToken 不需要自我,并发布你的完整代码

标签: angularjs factory self


【解决方案1】:

最终通过在一个对象中声明所有函数并返回该对象来解决这个问题。然后简单地调用 authToken.getToken 并且在我的世界中一切正常!

angular.module('psJwtApp').factory('authToken', function ($window) {
var storage = $window.localStorage;
var cachedToken;
var userToken = 'userToken';
var authToken = {
    setToken: function(token){
      cachedToken = token;
      storage.setItem( userToken, token);
    },
    getToken: function(){
      if(!cachedToken) 
        {cachedToken = storage.getItem(userToken)};
        return cachedToken; 
    },
    isAuthenticated: function() {
      return !!authToken.getToken();
    },
    removeToken: function() {
      cachedToken = null;
      storage.removeItem(userToken);
    }
  };
  return authToken;

});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-18
    • 2011-01-15
    • 1970-01-01
    • 2016-03-23
    相关资源
    最近更新 更多