子状态不等待父解决

Child state not waiting from parent resolve

我有一个父状态,它在其解析中加载了一个 JavaScript 文件(比如 abc.js)。所有子状态的控制器都在该 abc.js 文件中定义。所以很明显,我希望在父级完成加载后解析所有子状态 abc.js。请在下面找到我的代码片段 -

    .state('parent', {
        url: '/role',
        templateUrl: 'something.tmpl.html',
        resolve: {
            loadRoleScript: function() {
                var injector = angular.injector(['ng']),
                    q = injector.get('$q'),
                    deferred = q.defer(),
                    scriptTag = '';

                scriptTag = document.createElement('script');
                scriptTag.type = 'text/javascript';
                scriptTag.src = 'path/to/js/file/abc.js';
                scriptTag.onload = scriptTag.onreadystatechange = function(_, isAbort) {
                    if (!scriptTag.readyState || /loaded|complete/.test(scriptTag.readyState)) {
                        if (isAbort) {
                            deferred.reject();
                        } else {
                            setTimeout(function() {
                                // Here goes some of my logic
                                console.log('Parent resolved');
                                deferred.resolve();
                            }, 100);
                        }
                    }
                };
                scriptTag.onerror = function() {
                    deferred.reject();
                };
                document.body.appendChild(scriptTag);
            }
        }
    })
    .state('parent.dashboard', {
        url: '/roledashboard',
        controller: 'RoleHomeCtrl',
        templateUrl: 'something/child.tmpl.html',
        resolve: {
            dependent1: ['loadRoleScript', function(loadRoleScript) {
                console.log('child getting loaded before parent is resolved');
            }]
        }
    });

我在控制台上得到的输出 -

在解析父项之前加载子项。

家长已解决。

我关注了多个这样的链接 - https://github.com/angular-ui/ui-router/issues/1903 但是到处都建议的解决方案对我不起作用。

$ocLazyLoad 也是一个选项,但尝试自己实现。

提前致谢!

我认为你需要将你的代码修改成这样:

 .state('parent', {
        url: '/role',
        templateUrl: 'something.tmpl.html',
        resolve: {
            loadRoleScript: function() {
                var injector = angular.injector(['ng']),
                    q = injector.get('$q'),
                    deferred = q.defer(),
                    scriptTag = '';

                scriptTag = document.createElement('script');
                scriptTag.type = 'text/javascript';
                scriptTag.src = 'path/to/js/file/abc.js';
                scriptTag.onload = scriptTag.onreadystatechange = function(_, isAbort) {
                    if (!scriptTag.readyState || /loaded|complete/.test(scriptTag.readyState)) {
                        if (isAbort) {
                            deferred.reject();
                        } else {
                            setTimeout(function() {
                                // Here goes some of my logic
                                console.log('Parent resolved');
                                deferred.resolve();
                            }, 100);
                        }
                    }
                };
                scriptTag.onerror = function() {
                    deferred.reject();
                };
                document.body.appendChild(scriptTag);
                // !!
                // !!
                return deferred.promise;
                // !!
                // !!

            }
        }
    })
 .state('dashboard', {
        parent:'parent',
        url: '/roledashboard',
        controller: 'RoleHomeCtrl',
        templateUrl: 'something/child.tmpl.html',
        resolve: {
            dependent1: function(loadRoleScript) {
                console.log('child getting loaded before parent is resolved');
            }
        }
    });

那么应该正确解析父状态