ngHide 指令仅在页面刷新后与 ngRoute 模块一起使用
ngHide directive only works with ngRoute module after page refresh
当我登录我的应用程序时,我希望登录和注册按钮从导航中消失,因此如果登录成功并且从服务器收到令牌,我将使用 ng-hide 指令,我将其存储在 cookie 中。
导航是索引.html文件的一部分。
因为我使用的是角度路由,所以登录成功时,索引.html不会再次加载,而是通过 ng-view 指令呈现主页。
问题是我必须刷新页面才能使用 ng-hide。我假设这是因为ng-hide是索引.html页面的一部分,该页面不会重新加载。
希望有一个 bette 解决方案,而不是每次有人登录时刷新页面。
这是我的一些相关代码。
.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>
应用.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('/')
});
};
您将导航栏放在索引页上。它不是路由模块加载的模板。因此,它与绑定的任何路由和控制器无关。在路由中声明的控制器仅适用于路由模块加载的模板。
要绑定控制器,无论路由是什么,请使用 ng-controller 指令。把它放在你的<nav>
元素上
请注意,如果您使用"作为控制器"语法,则必须在控制器中执行: 这个.is禁用而不是 $scope.is禁用
文档 : https://docs.angularjs.org/#!/api/ng/directive/ngController
如果需要使用应用程序的其余部分将数据更新到该控制器。使用$rootScope。如果使用"ctrl as"语法,则更容易做到: 这个.$rootScope=$rootScope;
如果您不喜欢这样,请使用$watch来监视更改并将 currentValue 重新绑定到控制器:
$rootScope.watch('myParameter', function(new){
this.myParameter = new;
});
并且不要忘记在$ROOTSCOPE中初始化变量。或者,变量最终将位于导航栏控制器不可见的子作用域中。
你应该用其他变量声明来声明$scope.token。当您最初设置 ng-hide 时,它不存在于范围内。
$scope.isDisabled = false;
$scope.token;
您是否尝试过使用 $scope.$apply() ???
$scope.$apply(function() {
$scope.token = <whatever value>;
})
我认为一种方法是为导航添加一个控制器,比如导航栏控制器。
<nav ng-controller="navbarController">...</nav>
Inject $rootScope into both maincontroller and navbarController.
然后在主控制器中,每当您需要更改令牌的值时,请执行此操作
$rootScope.$emit('tokenValueChange', <value>);
then in navbarController add,
$rootScope.$on('tokenValueChange', function(newValue) {
$scope.token = newValue;
})
I am not sure if this is a perfect method but this should work.
我有一个与OP(viditsaxena)类似的问题,并以与他相同的方式解决它。像他一样,我在位于索引.html中的导航中有ng-hide
。我的ng-hide
在初始页面加载时正常工作,但是当我尝试导航到其他视图时,我的ng-hide
在刷新页面之前无法正常工作。
我的解决方案:与@viditsaxena在接受答案下的评论中描述的方式相同(使用 $rootScope 而不是 $scope),但我想我会把我的实际代码放在这里向您展示我如何在我的应用程序中工作.js 文件:
我从这个开始(ng-hide 在我离开原始视图后需要刷新才能加载):
app.controller('routeController', ['$scope', '$location', function($scope, $location) {
$scope.showPortfolioHeader = $location.path() === '/jcRealty';
}]);
对此(现在我的 ng-hides 在我离开我的第一个视图后不需要刷新):
app.controller('routeController', ['$rootScope', '$location', function($rootScope, $location) {
$rootScope.showPortfolioHeader = $location.path() === '/jcRealty';
}]);
被接受的答案让我走了一段路,但我很难破译他回答中的一些语法。我自己的测试证实了他说的一些话。我上面的控制器(routeController
)与位于/jcRealty路径的视图有关。如果我把我的ng-hide
放在我的jcRealty视图中,它们使用$scope
正常工作(无需刷新)。但是由于我的ng-hide
在 index.html 上,在该控制器的路径之外,因此需要$rootScope
不需要重新加载页面。
- Javascript,访问一个主要对象模块模式中的每个对象
- 节点Js:How to catch a“;没有这样的文件或目录“;读取线模块出错
- 如何从模块链中调用函数.导出到节点中
- 尽管链接成功并已成功下载,但未找到NPM模块
- 节点是否需要模块传递带有方括号的arg?这是个错误吗
- 从模块内部访问Express装载路径
- RequireJS向模块传递配置总是返回undefined
- Node.js正在更改应用程序以使用集群模块
- 在Meteor项目中安装并包含npm模块后出错
- 模块模式和这个
- 将依赖外部库的UMD模块与browserfy捆绑在一起
- 找不到模块捆绑包
- JavaScript命名约定;静态“;类或模块
- 显示模块模式在Knockout中设置模型的新实例
- 有没有比在app.js上绑定模块名称更好的方法来动态加载视图模型和视图以显示模态
- NgRoute未加载(模块错误)
- 与 ngRoute 的模块依赖会破坏角度渲染
- ngHide 指令仅在页面刷新后与 ngRoute 模块一起使用
- 无法加载ngRoute模块
- Angular js错误:[$injector:modulerr]实例化ngroute模块失败,原因是: