在我的每个控制器中都有这样的代码,当我点击视图中的某个链接时执行:
$scope.logout = function() {
authenticationService.logout();
$scope.isAuthUser = false;
delete $localStorage.selectedModel;
$location.path('/login').search('key', null);
};
我是angularJS的新手并想知道:如何做得更好:
或
with directive:我知道如何使用控制器:$scope.isAuth = false;
- 使用服务:我不知道使用它,除了现在在每个控制器中写它,它会是这样的: / p>
$scope.logout = function() {
authenticationService.logout();
myNewService.logout();
$scope.isAuthUser = false;
};
视图:
<a href="javascript:void(0)" data-ng-click="logout()">
<span>Sign Out</span>
</a>
但似乎也很糟糕......怎么做?
答案 0 :(得分:2)
我会告诉你我是怎么做的。
特别是在你的情况下,服务会很好。您可以将注销逻辑放在服务配方中。 在需要的地方呼叫该服务。
答案 1 :(得分:2)
这个逻辑与指令无关,这是肯定的。您已经拥有authenticationService
所以这正是放置登录/注销功能的业务逻辑的地方。我建议将此代码从控制器移动到此服务中。
如果它是服务的一部分,控制器中唯一的代码就是
$scope.logout = authenticationService.logout;
那就是它。控制器应该尽可能小,没有业务逻辑,当然,查看逻辑很好。
现在,关于$scope.isAuthUser
。 isAuthUser
听起来非常像authenticationService
服务的属性,不是吗?毕竟authenticationService
是一个对象,它应该包含相关模型/数据层的方法和属性。所以它应该再次转移到相同的服务中。
如果您需要在模板中使用此标志(可能显示/隐藏某些按钮等),您可以将此服务全部公开到$ scope / $ rootScope属性中。比如说,在顶级控制器中你可以这样做:
app.controller('mainController', ['$scope', 'authenticationService', function($scope, authenticationService) {
$scope.auth = authenticationService;
}]);
然后在任何模板中,您只需使用
<a href="#/logout" ng-click="logout()" ng-show="auth.isAuthUser">Logout</a>