javascript - ngHide 指令仅在页面刷新后适用于 ngRoute 模块

标签 javascript html angularjs ngroute ng-hide

当我登录我的应用程序时,我希望登录和注册按钮从导航中消失,所以如果登录成功并且从服务器收到 token ,我将使用 ng-hide 指令,我将其存储在 cookie 中.

Nav 是 index.html 文件的一部分。

因为我使用的是 Angular 路由,当登录成功时,index.html 不会再次加载,而是通过 ng-view 指令呈现主页。

问题是我必须刷新页面才能让 ng-hide 工作。我假设这是因为 ng-hide 是 index.html 页面的一部分,它不会重新加载。

希望有比每次有人登录时刷新页面更好的解决方案。

这是我的一些相关代码。

HTML

<!-- Navigation -->
<nav class="navbar navbar-custom navbar-fixed-top" role="navigation">
    <div class="container">
        <div class="navbar-header">
            <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-main-collapse">
                <i class="fa fa-bars"></i>
            </button>
            <a class="navbar-brand page-scroll" href="#/">
                <i class="fa fa-play-circle"></i>  <span class="light">Webnar</span>
            </a>
        </div>

        <!-- Collect the nav links, forms, and other content for toggling -->
        <div class="collapse navbar-collapse navbar-right navbar-main-collapse">
            <ul class="nav navbar-nav">
                <!-- Hidden li included to remove active class from about link when scrolled up past about section -->
                <li class="hidden">
                    <a href="#page-top"></a>
                </li>
                <li>
                    <a class="page-scroll" href="#about">Webinars</a>
                </li>
                <li ng-hide="token">
                    <a class="page-scroll" href="#/login">Login</a>
                </li>
                <li ng-show="token">
                    <a class="page-scroll " href="#/create">Add a webinar</a>
                </li>
                <li ng-hide="token">
                    <a class="page-scroll btn btn-default " href="#/signup">Sign Up</a>
                </li>
                <li ng-show="token" >
                  <a class="page-scroll btn btn-default" ng-click="logOut()">Logout</a>
                </li>

            </ul>
        </div>
        <!-- /.navbar-collapse -->
    </div>
    <!-- /.container -->
</nav>

App.js

var webinarApp = angular.module('webinarApp', ['ngCookies', 'ngRoute']);

webinarApp.config(function($routeProvider){

    $routeProvider

    .when('/', {
      templateUrl: './home.html',
      controller: 'mainController'
    })
    .when('/signup', {
      templateUrl: './signup.html',
      controller: 'mainController'
    })
    .when('/login', {
      templateUrl: './login.html',
      controller: 'mainController'
    })
    .when('/create', {
      templateUrl: './create.html',
      controller: 'mainController'
    })
});

webinarApp.controller('mainController', ['$scope', '$http', '$cookies', '$location', function($scope, $http, $cookies, $location){

  $scope.welcomeMessage = '';
  $scope.users = [];
  $scope.searchQuery = "";
  $scope.orderByField = 'name';
  $scope.newUser = {};
  $scope.logInUser = {};
  $scope.webinars = [];
  $scope.newWebinar = {};
  $scope.isDisabled = false;


  // ============== Users ================

  $scope.getUsers = function(){
    $http.get('/api/users').then(function(response){
      $scope.users = response.data;
    });
  };
  $scope.getUsers();

  $scope.createUser = function(){
    $http.post('/api/users', $scope.newUser).then(function(response){
      console.log(response.data)
      $scope.users.push(response.data);
      $scope.newUser = {};
      $location.path('/login');
    });
  };

  $scope.obtainToken = function(){
    $http.post("/api/users/authentication_token", $scope.logInUser).then(function(reponse){
      $scope.token = reponse.data.token;
      console.log($scope.token);
      $cookies.put('token', $scope.token);
      $location.path('/')
    });
  };

最佳答案

这是因为你把导航栏放在了索引页上。它不是由路由模块加载的模板。所以它与任何与之绑定(bind)的路由和 Controller 无关。路由中声明的 Controller 只适用于路由模块加载的模板。

无论路由是什么,要绑定(bind) Controller ,请使用 ng-controller 指令。把它放在你的 <nav> 上元素

请注意,如果您使用“as controller”语法,则必须在 controller 中执行: 这个.isDisabled 代替 $scope.isDisabled

文档:https://docs.angularjs.org/#!/api/ng/directive/ngController

如果您需要使用应用程序的其余部分将数据更新到该 Controller 。使用 $rootScope。如果您使用“ctrl as”语法,则更容易做到: this.$rootScope=$rootScope;

如果你不喜欢这个,使用 $watch 来观察变化并将 currentValue 重新绑定(bind)到 Controller :

$rootScope.watch('myParameter', function(new){
     this.myParameter = new;
});

并且不要忘记初始化 $ROOTSCOPE 中的变量。或者该变量最终会出现在您的导航栏 Controller 不可见的子作用域中。

关于javascript - ngHide 指令仅在页面刷新后适用于 ngRoute 模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35064454/

相关文章:

javascript - 可观察数组在 Knokcout 中不会重置

javascript - 如果不存在则申请类(class)

javascript - "input"类型范围内的问题,以及JavaScript设计视频播放器

AngularJS 初始化指令/ Controller 的 $scope

angularjs - 在页面加载时使用 AngularJS 将 json 绑定(bind)到 HTML 表

javascript - 网页开发 : Disabling Chrome's Cache doesn't work on osx

java - JS 和 Spring 的麻烦

java - Gmap Angularjs Gif 标记不循环

html - 这个 css 规则 -ms-high-contrast-adjust 是什么?

javascript - 具有可编辑的 dropzonejs,未应用 css 类