简体   繁体   English

如何使AngularJS控制器依赖于通过Ajax在rootScope上加载的值?

[英]How can I make an AngularJS controller depend on a value loaded on the rootScope via ajax?

I have an app that is loaded like so: 我有一个这样加载的应用程序:

app.js: 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();
            });
    }
}]);

Then in a different controller I want to load a template based on whether the user is logged in or not (ie if username is set): 然后在另一个控制器中,我想根据用户是否登录(即,如果设置了用户名)来加载模板:

DataController.js: 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';
    }
}

How can I make DataController dependent on the username value asynchronously loaded on $rootScope? 如何使DataController依赖于$ rootScope异步加载的用户名值?

I thought about using a promise, but I'm not sure how to pass that state to my DataController. 我考虑过使用Promise,但是我不确定如何将该状态传递给DataController。

Thanks! 谢谢!

In your app.js 在您的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
            });
    }
}]);

In your controller: 在您的控制器中:

$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';
    }
});

By default show a loading screen, inside the event handler check for user name and show the appropriate template 默认情况下,显示加载屏幕,在事件处理程序中检查用户名并显示适当的模板

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM