我有一个工厂返回3个函数:setTokengetTokenisAuthenticated。前两个函数是预定义的,最后一个使用getToken调用this.getToken函数。

将工厂注入(inject) Controller 时,我然后使用isAuthenticated()调用第三个函数(ng-show)。我在控制台中收到以下错误:



有人可以帮我解决我做错的事情吗?

工厂:

'use strict';

angular.module('psJwtApp').factory('authToken', function($window) {
  //define storage
  var storage = $window.localStorage;
  var cachedToken;

  // Public API here
  return {
    setToken: function(token) {
      cachedToken = token;
      storage.setItem('userToken', token);
    },
    getToken: function() {
      if (!cachedToken) {
        cachedToken = storage.getItem('userToken');
      }
      return cachedToken;
    },
    isAuthenticated: function() {
      //return true if we get something from getToken
      return !!this.getToken();
    }
  };

});

Controller :
'use strict';

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

View :
  <ul class="nav navbar-nav">
    <li ui-sref-active="active">
      <a ui-sref="main">Home</a>
    </li>
    <li ng-hide="isAuthenticated()" ui-sref-active="active">
      <a ui-sref="register">Register</a>
    </li>
    <li ng-show="isAuthenticated()" ui-sref-active="active">
      <a ui-sref="logout">Logout</a>
    </li>
  </ul>

如果您觉得缺少任何东西或需要更多信息,请询问,我将其添加到问题中。

最佳答案

getToken是要在工厂中公开的对象的静态方法,因此无法使用this进行引用。但是,您可以执行以下操作:

'use strict';

angular.module('psJwtApp').factory('authToken', function($window) {
  //define storage
  var storage = $window.localStorage;
  var cachedToken;

  var setToken = function(token) {
    cachedToken = token;
    storage.setItem('userToken', token);
  };
  var getToken = function() {
    if (!cachedToken) {
      cachedToken = storage.getItem('userToken');
    }
    return cachedToken;
  };
  var isAuthenticated = function() {
    //return true if we get something from getToken
    return !!getToken();
  };

  // Public API here
  return {
    setToken: setToken,
    getToken: getToken,
    isAuthenticated: isAuthenticated
  };

});

09-20 17:52