【问题标题】:Angular UI router: where should I be changing state? Controllers? Services? Event listeners?Angular UI 路由器:我应该在哪里更改状态?控制器?服务?事件监听器?
【发布时间】:2016-12-17 08:01:40
【问题描述】:

这是一个最佳实践问题。

我有一个带有一些嵌套状态和视图的 Angular 应用程序。

当我的用户点击“退出”按钮时,它会附加到控制器函数,然后控制器函数会调用身份验证服务中的函数。然后,身份验证服务会调用服务器,并且需要将用户重定向到登录页面。

我对实际的“state.go('login')”应该在哪里进行了一些思考。

(1) 服务调用服务器,当调用完成时,服务将状态更改为登录。

这感觉很糟糕,因为在我看来,服务应该是一些提供数据或功能的静态实体,并与应用程序的其余部分分开。

(2) 控制器调用鉴权服务后改变状态为登录。

这似乎更好。无论如何,控制器已经附加了应用程序和标记。

(3) 服务发出我在 EVENTS.LOGOUT_SUCCESSFUL 等应用程序常量中定义的自定义操作,然后在根范围内监听该事件并在事件监听器中执行 state.go。

不确定这个,它使事情变得更复杂但看起来相当干净。

有什么想法吗?

【问题讨论】:

    标签: javascript angularjs angular-ui-router


    【解决方案1】:

    我同意你的想法,如果这是退出的唯一流程,我更喜欢 2 而不是 3。

    如果有不同的注销方式(例如强制注销),选项 3 对我来说更有意义。

    【讨论】:

      【解决方案2】:
          Change your State in the Controllers. Refer to following example ...
      
      ----------------------------------------------------------------------------
      # config.js
      
      (function() {
          'use strict';
      
          angular
              .module('app.foo.authentication')
              .config(moduleConfig);
      
          /* @ngInject */
          function moduleConfig($translatePartialLoaderProvider, $stateProvider) {
              $translatePartialLoaderProvider.addPart('app/foo/authentication');
      
              $stateProvider
      
              .state('authentication.logout', {
                  url: '/logout',
                  templateUrl: 'app/foo/authentication/logout/logout.tmpl.html',
                  controller: 'LogoutController',
                  controllerAs: 'vm'
              });
          }
      })();
      
          -------------------------------------------------------------------------
          # logout.controller.js
      
          (function() {
              'use strict';
      
              angular
                  .module('app.foo.authentication')
                  .controller('LogoutController', LogoutController);
      
              /* @ngInject */
              function LogoutController(
                  $scope,
                  $state,
                  $mdToast,
                  $filter,
                  $http,
                  $window,
                  triSettings,
                  session) {
                  var vm = this;
                  vm.triSettings = triSettings;
                  vm.backToLogin = backToLogin;
                  vm.loading = false;
      
                  function backToLogin () {
                      vm.loading = true;
                      session.end();
                      $window.location.reload();
                      $state.go('authentication.login');
                  }
              }
          })();
      
          ----------------------------------------------------------------------------
      
          # logout.html
      
          <div layout="row" flex layout-padding layout-fill layout-align="center center">
              <div class="logout-card" flex="40" flex-lg="50" flex-md="70" flex-xs="100">
                  <md-card>
                      <md-toolbar class="padding-20 logout-card-header">
                          <div layout="row" layout-align="center center">
                              <img ng-src="{{::vm.logo}}" alt="{{vm.name}}">
                          </div>
                          <div layout="row" layout-align="center center">
                              <h1 class="md-headline" translate>LOGOUT.TITLE</h1>
                          </div>
                      </md-toolbar>
      
                      <md-content class="md-padding">
                          <p translate>LOGOUT.MESSAGES.SUCCESS</p>
      
                          <div layout="row" layout-align="center center">
                              <md-progress-circular ng-show="vm.loading" md-mode="indeterminate"></md-progress-circular>
                          </div>
      
                          <form name="logout">
                              <md-button
                                  class="md-raised md-primary full-width margin-left-0 margin-right-0 margin-top-10 margin-bottom-10"
                                  ng-click="vm.backToLogin()"
                                  translate="LOGOUT"
                                  aria-label="{{'LOGOUT' | translate}}">
                              </md-button>
                          </form>
                      </md-content>
                  </md-card>
              </div>
          </div>
      

      【讨论】:

        猜你喜欢
        • 2016-06-25
        • 1970-01-01
        • 2018-04-17
        • 1970-01-01
        • 1970-01-01
        • 2017-11-14
        • 1970-01-01
        • 1970-01-01
        • 2020-05-07
        相关资源
        最近更新 更多