我正在开发一个后台,使用Angular,HTML& jQuery有一个单页应用程序。我在用户身份验证。 我创建了一个cookie来拥有一个“用户会话”,我可以在用户注销时将其销毁。但我使用Bootstrap,我有一个带有用户名的下拉菜单,左边有一个菜单,我想在用户断开连接时隐藏它们。
每个菜单都有一个控制器,如果我重新执行它们,它将隐藏我想要的内容。
示例:
.controller('SessionController', ['$scope', '$http', '$location', '$cookies', function ($scope, $http, $location, $cookies) {
if (typeof $cookies.userSession === "undefined") {
$(".nav.navbar-nav.navbar-right").hide();
$location.path("/");
} else {
$("#userLogin").text($cookies.userSession);
$(".nav.navbar-nav.navbar-right").show();
$location.path("/customers");
}
}])
我已经阅读了有关$ scope.digest()和$ scope.apply()的内容,但我无法做到。也许有指令?
答案 0 :(得分:1)
如果您使用ui-router,则可以轻松强制重新加载:
.controller('SessionController', ['$scope', '$http', '$location', '$cookies','$state', function ($scope, $http, $location, $cookies,$state) {
if (typeof $cookies.userSession === "undefined") {
$(".nav.navbar-nav.navbar-right").hide();
$state.go('home',{},{reload:'true'});
} else {
$("#userLogin").text($cookies.userSession);
$(".nav.navbar-nav.navbar-right").show();
$state.go('customers',{},{reload:'true'});
}
}])
请注意,此代码片段使用的状态home
和customers
应该在其他位置定义。
答案 1 :(得分:0)
我确信有很多方法可以实现你真正想要做的事情(显示/隐藏内容,而不是重新构建控制器)。最简单的可能是在范围上创建isLoggedIn
属性并使用ng-show
/ ng-hide
指令。或者您可以将登录信息分成自己的模板,然后使用ng-include
显示登录表单或真实内容。
解决您对cookie和重新加载的担忧:您只是不考虑Angular :)设置cookie可以在多个页面或通过页面重新加载时使用。但是,如果要利用Angular根据基础数据自动更新显示内容的能力(无需重新加载页面),则需要修改基础数据。我的意思是,您需要在$scope上创建一个属性,例如isLoggedIn
,并在设置Cookie时更新它。
答案 2 :(得分:0)
我做了一些与我最新的应用程序非常相似的东西,但你不刷新控制器。这是更多jquery式的思考。您想使用ng-show / ng-hide,并在控制器中设置正确的变量:
<div ng-show="user.loggedIn"><a href="/logout" ng-click="logout()">Logout</a></div>
<div ng-show="!user.loggedIn"><a href="/login">Login</a></div>
(您可以轻松地将下拉菜单放在上面的div中)
然后你的控制器应该
.controller('SessionController', function ($scope,AuthSvc) {
$scope.user = AuthSvc.user;
$scope.logout = function() {AuthSvc.logout();};
});
当用户退出时,只需将AuthSvc.user.loggedIn
设置为false
,它就会全面继承。这就是双向绑定的美妙。
.factory('AuthSvc',function() {
return {
user: {loggedIn:false},
logout : function() {
// do whatever other logout stuff you need, like deleting sessions
this.user.loggedIn = false;
},
login : function() {
// do whatever other login stuff you need, like validating with the server
this.user.loggedIn = true;
}
};
});