是否有可能在州外使用做出决议?

时间:2016-10-27 17:36:27

标签: angularjs angular-ui-router

我的网站导航在任何特定状态下都不存在。无论应用程序处于哪种状态,它始终位于页面顶部。

我需要隐藏/显示某些菜单选项,具体取决于用户是谁。我正在使用Windows身份验证,因此必须访问服务器。问题是因为导航栏不属于任何特定的状态我不知道在哪里解决。

是否有像全球国家这样的东西会在我可以解决的任何其他州之前首先得到解决?

类似的东西:

    .state('$global', {
        url: '/',
        templateUrl: 'partials/navigation/navbar.html',
        controller: 'NavCtrl',
        resolve: {
            navData: ['$http', 'SettingsFactory', 'ViewMatrixService', function($http, SettingsFactory, ViewMatrixService) {
                return $http.get(SettingsFactory.APIUrl + 'api/nav', { withCredentials: true }).then(function (response) {
                    ViewMatrixService.GenerateHomeViewMatrix(response.data.CurrentUser);
                    return response.data;
                });
            }]
        }
    })

我考虑使用$broadcast,但是我需要确保应用程序的每个可能的进入点从服务器获取导航栏需要的信息并通过导航栏广播它会污染我的所有其他控制器责任。

1 个答案:

答案 0 :(得分:0)

我无法找到在州之外使用解决方法的方法,但我确实找到了解决方案。

我创建了一个名为app的抽象父状态。我在app中有决心获取用户的个人资料。然后它可以注入任何子状态控制器。

由于导航栏是无状态的,因此我以同样的方式将currentUser对象传递给在整个应用程序中使用的服务,以存储所有控件的可见性和禁用标志。

看起来像这样:

$stateProvider
        .state('app', {
            abstract: true,
            template: '<ui-view/>',
            resolve: {
                currentUser: ['$http', 'SettingsFactory', 'ViewMatrixService', function($http, SettingsFactory, ViewMatrixService) {
                    return $http.get(SettingsFactory.APIUrl + 'api/users/current', { withCredentials: true }).then(function (response) {
                            ViewMatrixService.GenerateHomeViewMatrix(response.data);
                            return response.data;
                        });
                    }
            ]}
        })
        .state('app.home', {
            url: '/',
            templateUrl: 'partials/home.html',
            controller: 'HomepageCtrl',
            resolve: {
                homeData: ['$http', 'SettingsFactory', function($http, SettingsFactory) {
                    return $http.get(SettingsFactory.APIUrl + 'api/home', { withCredentials: true }).then(function (response) {
                        return response.data;
                    });
                }]
            }
        })
    .state('app.userProfiles', {
        url: '/admin/users',
        templateUrl: 'partials/admin/user-profiles.html',
        controller: 'UserProfilesCtrl'
    })...