我想在任何页面上从导航栏访问注销功能

时间:2016-11-24 01:16:22

标签: angularjs angular-ui-router

我有一个身份验证过程,我希望能够从我的Index.html导航栏访问任何页面上的注销功能,但由于某种原因,我没有达到范围。

我有我的app.js控制器,但当我切换视图时,该控制器被替换。所以我将下面的函数放在新视图上:

$scope.logout = function() {
    AuthService.logout();
    $state.go('login');
};

但是当我从index.html导航系统调用它时,我无法访问该功能。

我正在使用ui-router。

所以我的布局是这样的:

<html>
    <nav></nav>
    <ui-view></ui-view>
<html>

你会在哪里放置和访问可以从任何地方访问的注销功能?

1 个答案:

答案 0 :(得分:0)

由于导航控制器不是所有其他控制器/视图的父级,因此对问题来说似乎有些过分。他们可能是兄弟姐妹,或者他们根本没有使用嵌套状态的亲子关系。

如果您只是从导航栏 访问此注销方法,则只需要在ng-controller指令中创建/声明该控制器:

<强> nav.html

<nav ng-controller="NavigationCtrl" />
    <ul>
        <li>Home</li>
        <li ng-click="logout()">Logout</li>
    </ul>
</nav> 

如果您是从应用中的任何位置访问此方法,我会创建一个指令并聆听$rootScope这样的事件:

<强> logout.directive.js

.directive('logout', logoutMethod);

logoutMethod.$inject = [
    '$rootScope',
    'AuthService',
    '$state'
];

function logoutMethod(
    $rootScope,
    AuthService,
    $state
){
    return {
        restrict: 'A',
        link: function() {
            $rootScope.$on('initiateLogout', function() {
                AuthService.logout(); 
                $state.go('logout');
            });
        }
    };
});

然后在你的应用程序的某个地方,

$rootScope.$emit('initiateLogout');