Angular UI路由器:我应该在哪里更改状态?控制器?服务?事件听众?

时间:2016-08-10 19:17:46

标签: javascript angularjs angular-ui-router

这是一个最佳实践问题。

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

当我的用户点击"退出"按钮,它附加到控制器功能,然后控制器功能调用认证服务中的功能。然后,身份验证服务会调用服务器,并在那里的某个位置将用户重定向到登录页面。

我已经有了一些思路,其中包含实际的状态('登录')"应该是。

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

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

(2)控制器在调用认证服务后将状态更改为登录。

这似乎更好。无论如何,控制器已连接应用程序和标记。

(3)服务发出一个我在app常量中定义的自定义操作,如EVENTS.LOGOUT_SUCCESSFUL,然后在根范围上我监听该事件并在事件监听器中执行state.go。

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

有什么想法吗?

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分:1)

我同意你的想法,如果这是注销的唯一流程,我宁愿选择2以上。

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

相关问题