UserService
来维护用户的(布尔)sessionStatus
。ng-show=sessionStatus
上的[LOGOUT](即如果未登录(false),则不显示)。 sessionStatus
的{li> ViewController
应该始终与UserService
的那个相匹配...对吗?
sessionStatus
值更改,并且视图应使用ng-show...
的新结果进行更新。 <a ng-show="sessionStatus" ng-click="logout()">Logout</a>
app.controller('AppController', function($scope, $interval, $http, UserService) {
$scope.logout = function() { UserService.logout(); }
// This ain't working
$scope.$watch(UserService.sessionStatus, function() {
$scope.sessionStatus = UserService.sessionStatus;
});
});
注意:appUser是HTML头中注入的全局变量(一个hacky修复,直到我得到会话/ cookie的东西正常工作)
app.factory('UserService', function($http) {
var pre;
var sessionStatus;
function init() { // Logged in : Logged out
pre = appUser.user != undefined ? appUser.user : { name: 'Logged out', uid: '0' };
sessionStatus = pre.uid != "0" ? true : false;
}
function resetSession() { appUser = null; init(); }
init();
return {
sessionStatus: function() { return sessionStatus; }, // update on change!
logout: function() {
$http.get("/logout").then(function (data, status, headers, config) {
resetSession();
})
}
};
});
答案 0 :(得分:9)
而不是watch
,只需使用从function
返回会话状态的范围service
。
$scope.sessionStatus = function() {
return userService.sessionStatus();
};
您的退出链接如下所示:
<a ng-show="sessionStatus()" ng-click="logout()">Logout</a>
为您的功能提供了一个精简的Plunker:http://plnkr.co/edit/u9mjQvdsvuSYTKMEfUwR?p=preview
答案 1 :(得分:2)
使用范围函数更清晰,并且是“正确”的方法。然而,为了完整起见,您还可以修理手表:
$scope.$watch(function () {
return UserService.sessionStatus;
}, function() {
$scope.sessionStatus = UserService.sessionStatus;
});
$watch method的第一个参数采用WatchExpression,可以是字符串或方法。
但同样,$ watch不应该用在控制器中。使用建议的范围方法更干净,更容易测试。