Javascript 如何使AngularJS控制器依赖于通过ajax加载到rootScope上的值?

Javascript 如何使AngularJS控制器依赖于通过ajax加载到rootScope上的值?,javascript,ajax,angularjs,Javascript,Ajax,Angularjs,我有一个这样加载的应用程序: app.js: angular.module('App', []).run(['$rootScope', '$q', 'SessionManager', 'EndpointService', function ($rootScope, $q, SessionManager, EndpointService) { $rootScope.username = SessionManager.getUsername(); if (!$rootScope.us

我有一个这样加载的应用程序:

app.js:

angular.module('App', []).run(['$rootScope', '$q', 'SessionManager', 'EndpointService',
function ($rootScope, $q, SessionManager, EndpointService) {
    $rootScope.username = SessionManager.getUsername();
    if (!$rootScope.username) {
        EndpointService.getUser()
            .success(function (data) {
                data = angular.fromJson(data.data);
                SessionManager.setUsername(data['username']);
                $rootScope.username = SessionManager.getUsername();
            });
    }
}]);
然后,在另一个控制器中,我希望根据用户是否登录(即,如果设置了用户名)加载模板:

DataController.js:

function DataController($scope, $state, $stateParams, $http, $log, $location, $rootScope, $q) {
    if($rootScope.username) {
        var template = 'static/partials/auth_table.html';
    } else {
        var template = 'static/partials/login.html';
    }
}
如何使DataController依赖于异步加载到$rootScope上的用户名值

我考虑过使用承诺,但我不确定如何将该状态传递给我的DataController


谢谢

在你的
app.js

angular.module('App', []).run(['$rootScope', '$q', 'SessionManager', 'EndpointService',
function ($rootScope, $q, SessionManager, EndpointService) {
    $rootScope.username = SessionManager.getUsername();
    if (!$rootScope.username) {
        EndpointService.getUser()
            .success(function (data) {
                data = angular.fromJson(data.data);
                SessionManager.setUsername(data['username']);
                $rootScope.username = SessionManager.getUsername();
                // after this step, broadcast the event
                $rootScope.$broadcast('user-loggedin');
               // pass data if required
            });
    }
}]);
在控制器中:

$scope.$on('user-loggedin', function(event, data) {
    var template;
    // do what you want to do
    if($rootScope.username) {
       template = 'static/partials/auth_table.html';
    } else {
       template = 'static/partials/login.html';
    }
});

默认情况下,在事件处理程序内部显示加载屏幕,检查用户名,并在ajax调用广播$rootscope值后显示相应的模板

,然后在控制器中使用$scope收听该值。$on