Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/445.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在激发$stateChangeStart之前解析抽象父级中的承诺_Javascript_Angularjs_Promise_Angular Ui Router_Angular Promise - Fatal编程技术网

Javascript 在激发$stateChangeStart之前解析抽象父级中的承诺

Javascript 在激发$stateChangeStart之前解析抽象父级中的承诺,javascript,angularjs,promise,angular-ui-router,angular-promise,Javascript,Angularjs,Promise,Angular Ui Router,Angular Promise,我试图在加载Home子状态之前解析抽象父状态中的一些服务器端数据。我想确保在州的data.rule函数中有用户的全名以供检查。但是,使用console.log语句,我可以看到userFullName在factory.privilegeData方法中的“done”语句之前以空字符串的形式打印到控制台 编辑 父解析中的数据是来自服务器的安全数据,需要在初始化任何控制器之前全局可用。此处仅列出一个子状态(为了可读性),但login之外的所有状态都是抽象父级的子级。完成父级解析后,数据将存储在$root

我试图在加载
Home
子状态之前解析抽象父状态中的一些服务器端数据。我想确保在州的
data.rule
函数中有用户的全名以供检查。但是,使用console.log语句,我可以看到
userFullName
factory.privilegeData
方法中的“done”语句之前以空字符串的形式打印到控制台

编辑

父解析中的数据是来自服务器的安全数据,需要在初始化任何控制器之前全局可用。此处仅列出一个子状态(为了可读性),但
login
之外的所有状态都是抽象父级的子级。完成父级解析后,数据将存储在
$rootScope
中,并用于在每个状态下通过
data.rule
函数确定访问权限

config.js

    $rootScope.$on("$stateChangeStart", function (event, toState, toParams, fromState, fromParams) {
        if(toState.authenticate){
            if(authService.authKeyExists()){
                if(toState.data.rule($rootScope)){
                    navigationService.addNavObject("activity", {
                        summary : "Page navigation",
                        page : $location.absUrl().replace("#/", "")
                    });
                } else {
                    $state.go('app.home');
                }
            } else {
                event.preventDefault();
                $state.go('login');
            }   
        }
    });
更新:根据下面的回答,我已经更新了父/子状态,但是我仍然遇到同样的问题:

        .state('app', {
            url:'',
            abstract: true,
            template: '<div ui-view class="slide-animation"></div>',
            resolve:{
                privileges: ['$q', 'privilegesService', function($q, privilegesService){
                    console.log('from parent resolve');
                    return privilegesService.getPrivileges()
                                            .then(privilegesService.privilegesData)
                                            .catch(privilegesService.getPrivilegesError);
                }]
            }
        })
        .state('app.home', {
            url: '/home',
            templateUrl: 'app/components/home/home.html',
            controller: 'HomeController',
            controllerAs: 'vm',
            parent: 'app',
            resolvePolicy: {when:'LAZY', async: 'WAIT'},
            authenticate: true,
            data:{
                rule: function($rootScope){
                    console.log("from home state data rule");
                    return true;
                }
            }                   
        })
基于上面的
控制台
状态,我得到以下输出。我需要上一次出现来自家乡州数据的
规则

…因为我正在使用
data.rule
函数的结果对每个状态进行授权。下面是我的
.run
方法中的
$stateChangeStart

app.route.js

    $rootScope.$on("$stateChangeStart", function (event, toState, toParams, fromState, fromParams) {
        if(toState.authenticate){
            if(authService.authKeyExists()){
                if(toState.data.rule($rootScope)){
                    navigationService.addNavObject("activity", {
                        summary : "Page navigation",
                        page : $location.absUrl().replace("#/", "")
                    });
                } else {
                    $state.go('app.home');
                }
            } else {
                event.preventDefault();
                $state.go('login');
            }   
        }
    });

子状态需要父状态作为依赖项,以便它等待加载,即使它没有直接使用

您必须尝试以下方法:

.state('app.home', {
    url: '/home',
    templateUrl: 'app/components/home/home.html',
    controller: 'HomeController',
    controllerAs: 'vm',
    parent: 'app',
    authenticate: true,
    data:{
        rule: function($rootScope){
            console.log($rootScope.userFullName);
            return true;
        }
    }                   
})

您可以使用属性并将其设置为LAZY,状态的LAZY resolves将在开始加载之前等待父状态的resolve完成。

您可以在子状态中直接使用resolve并避免这种情况altogether@ZeRubeus有多个子状态使用解析中的权限数据。为了可读性,我只包含了一个。是否需要在州名称中指定点符号以及
parent
属性(在子州中)?我目前将
parent
设置为
app
(我将在我的帖子中添加一个编辑来澄清这一点),我需要在parent中解析的数据是站点其余部分使用的全局数据。实际上,我不需要将它注入任何子状态,它的服务器数据存储在
$rootScope
中。删除父状态并使用点表示法,或者简单地使用resolvepolicy:“LAZY”我是否也需要在子状态中定义
resolve
属性,或者简单地使用
resolvepolicy
,因为它的父级包含
resolve
?是这样:
resolvepolicy:{when:'LAZY',async:'WAIT'},