angularJS:哪里更好地放置signOut逻辑?

时间:2015-02-19 12:18:57

标签: javascript angularjs

在我的每个控制器中都有这样的代码,当我点击视图中的某个链接时执行:

  $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>

但似乎也很糟糕......怎么做?

2 个答案:

答案 0 :(得分:2)

我会告诉你我是怎么做的。

  • 如果您在没有任何Ajax / API调用的情况下执行某些逻辑。去做 服务。
  • 如果您正在调用某些API - 那么工厂。
  • 如果您正在使用模板/ DOM操作,那么指令。

特别是在你的情况下,服务会很好。您可以将注销逻辑放在服务配方中。 在需要的地方呼叫该服务。

答案 1 :(得分:2)

这个逻辑与指令无关,这是肯定的。您已经拥有authenticationService所以这正是放置登录/注销功能的业务逻辑的地方。我建议将此代码从控制器移动到此服务中。

如果它是服务的一部分,控制器中唯一的代码就是

$scope.logout = authenticationService.logout;

那就是它。控制器应该尽可能小,没有业务逻辑,当然,查看逻辑很好。

现在,关于$scope.isAuthUserisAuthUser听起来非常像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>