带有TypeScript和controllerAs的$ rootScope

时间:2016-03-23 18:52:35

标签: angularjs typescript rootscope

我正在使用Angular 1和Typescript构建应用程序。以下是我的登录控制器

module TheHub {
    /**
     * Login page controller.
     */
    export class LoginController {

        static $inject = ['$http', '$rootScope', '$location'];

        constructor(private $http: ng.IHttpService, private $rootScope, private $location: ng.ILocationService) {

        }

        /**
         * Method to check if the user is logged in 
         */
        login(user: {}) {
            this.$http.post('/login', user).then((value: ng.IHttpPromiseCallbackArg<{}>) => {
                this.$rootScope.auth = { isAuthenticated: true, isAuthenticationChecked: true };
                this.$location.url('/');
            }, (error: any) => {
                this.$rootScope.auth = { isAuthenticated: false, isAuthenticationChecked: true };
            });
        }
    }

    angular.module('TheHub').controller('LoginController', LoginController);
}

现在我的应用程序的结构是“App”是主控制器,“LoginController”是嵌套在app下的控制器。从代码中可以看出,我试图在$ rootScope中更改某些内容,以便在登录过程成功后可以刷新引用App的视图。

不知何故,似乎根本没有效果。我检查了stackoverflow并发现了这个问题。

Define and Access $rootScope with controller as syntax

他们建议编写一个服务来抽象出我同意的身份验证信息但是双向数据绑定呢?

例如,我在App Controller的视图中有一个菜单,我希望在Login Controller成功完成登录过程时显示该菜单。

更新

App Controller:

module TheHub {
    /**
     * Root controller.
     */
    export class AppController {

        static $inject = ['$mdSidenav', '$rootScope'];

        constructor(private $mdSidenav: angular.material.ISidenavService, private $rootScope) {
        }

        /**
         * Handler for button click to show/hide left menu.
         */
        openLeftMenu = () => {
            this.$mdSidenav('left').toggle();
        }
    }

    angular.module('TheHub').controller('AppController', AppController);
}

查看:

<div id="sideNavContainer" ng-controller="AppController as ctrl" layout="column" ng-cloak layout-fill>
    <md-toolbar flex="none">
        <div class="md-toolbar-tools">
            <md-button class="md-icon-button" aria-label="Settings" hide-gt-md ng-click="ctrl.openLeftMenu()">
                <i class="material-icons">menu</i>
            </md-button>
            The Hub
            <span flex></span>
        </div>
    </md-toolbar>
    <md-content flex layout="row">
        <md-sidenav ng-show="ctrl.auth.isAuthenticated" class="md-sidenav-left" md-component-id="left" md-is-locked-open="$mdMedia('gt-md')" md-disable-backdrop md-whiteframe="4" flex="none">
            <md-content layout-padding>

            </md-content>
        </md-sidenav>
        <div ng-view flex="grow"></div>

    </md-content>
</div>

1 个答案:

答案 0 :(得分:1)

您的视图在auth中查找ctrl.auth对象。所以它期望它是AppController的属性。但事实并非如此。它是$rootScope的属性。由于每个表达式都在范围内进行评估,并且每个范围都继承自$ rootScope,因此您需要的只是

ng-show="auth.isAuthenticated"