0

我的问题与此类似: ng-show and ng-hide with jwt

尽管我按照 user3735441 的指示进行了修改,但仍然无法使它们正常工作:

服务 :

'use strict';

/**
 * @ngdoc service
 * @name ToDoManagerApp.authToken
 * @description
 * # authToken
 * Factory in the ToDoManagerApp.
 */
angular.module('ToDoManagerApp').factory('authToken', function($window) {
    var storage = $window.localStorage;
    var cachedToken;
    var userToken = 'userToken';
    var isAuthenticated = false;
    // Public API here
    var authToken = {
        setToken: function(token) {
            cachedToken = token;
            storage.setItem(userToken, token);
            isAuthenticated = true;
        },
        getToken: function() {
            if(!cachedToken)
              cachedToken = storage.getItem(userToken);

            return cachedToken;
        },
        isAuthenticated: function() {
            return !!authToken.getToken();
        },
        removeToken: function() {
            cachedToken = null;
            storage.removeItem(userToken);
            isAuthenticated = false;

        }
    };

    return authToken;
});

控制器 :

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

});

HTML:

<div ng-controller = "HeaderCtrl" class="header">
  <div class="navbar navbar-default" role="navigation">
    <div class="container">
      <div class="navbar-header">

        <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#js-navbar-collapse">
          <span class="sr-only">Toggle navigation</span>
          <span class="icon-bar"></span>
          <span class="icon-bar"></span>
          <span class="icon-bar"></span>
        </button>

        <a class="navbar-brand" href="#/">ToDoManager</a>
      </div>

      <div class="collapse navbar-collapse" id="js-navbar-collapse">

        <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>
      </div>
    </div>
  </div>
</div>

我想做的是:

1 - 显示注册,在没有设置令牌时隐藏注销(未经过身份验证)或 2 - 显示注销,在设置令牌时隐藏注册(经过身份验证)

现在我停留在第一个状态,无论是否经过身份验证,我都看不到注销按钮。

4

3 回答 3

0

您正在使用ng-hide和访问 $scope 模型ng-show。在您的服务中,您将其设置isAuthenticated为 false,并且永远不会将其设置为 True。所以你的应用程序卡在你的第一个状态,那里isAuthenticated是假的。

于 2015-02-20T20:37:27.700 回答
0

我完全忘记在我的注册控制器中添加“res”,这就是它没有更新的原因:

$http.post(url, user)
            .success(function(res) {
                alert('success', 'OK!', 'You are now registered');
                authToken.setToken(res.token);
            })
于 2015-02-20T21:17:10.803 回答
0

发生这种情况是因为您的控制器中的变量在您的工厂中更改时没有更新。为了解决这个问题,我通常使用 $broadcast。所以在你的工厂里你会有这样的功能......

var broadcastValue = function() {
  $rootScope.$broadcast('IsAuthenticated');
}

然后,您可以在希望接收者检查变量的任何时候调用此函数。

然后在你的控制器中你会有这样的东西来接收广播

$scope.$on('IsAuthenticated', function() {
  $scope.isAuthenticated = authToken.isAuthenticated;
});

这将确保您的控制器看到值何时更改。

另见这篇文章。

角度的 $on 和 $broadcast

于 2015-02-20T21:44:23.660 回答