在resolve和root index.html文件

时间:2016-10-19 19:47:17

标签: javascript angularjs rootscope dependency-resolver

两件事 -

我在index.html的头部有一个供应商脚本,我想传递一个特定于环境的变量。

<script type="text/javascript">!function () {analytics.load(--->code here<----);();</script>

我已将变量附加到运行块中的$ rootScope,但在加载此html时似乎没有准备好。我可以用

记录相同的代码
<a data-ng-click="$log.log('code', code)">code</a>

但运行head标签时似乎没有准备好。

此外 - 我还有一些其他值已附加到$ rootScope,这些值在解析运行时不可用。它在服务中是未定义的。如果我在该服务中执行console.log并在运行块中执行console.log,则服务首先记录为未定义,然后在执行运行块时,它已正确设置。

在根index.html文件的head元素和解析中使用这些变量需要做什么?

resolve: {
    auth: ['service', function (service) {
        return service.resolve()
    }]
}

service.resolve在页面呈现之前为所需的变量依赖性调用许多不同的服务。

更新

我之前提到的解决方案是$ route.resolve函数。它被放置在routeProvider中并在页面加载之前运行。

templateUrl: '/user.html',                    
controller: 'User',
controllerAs: 'user',
resolve: {
    auth: ['service', function (service) {
        return service.resolve()
    }]
}

解析功能内容 -

self.profilePromises().then(function (resp) {
    //this resp object is an array of promises that are mostly put into rootscope and/or used as params for other app setup functions - all things that need to be ready before the page resolves

    var map = self.resultMap

    for (var i = 0; i < resp.length; i++) {

        $rootScope[map[i]] = resp[i].data.data

        switch (map[i]) {
            case 'abc':
                $rootScope.abc = resp[i].data
                break
            case 'def':
                setUser(resp[i].data.data)
                break
            // etc
        }
    }
    return $q.when({auth: true})

}, function (resp) {
    return $q.reject({auth: false})
})

$ route.resolve可以使用在页面初始化之前必须执行的多个函数参数。这是我找到加载页面所需的变量的最佳方法。因此,它们通常是在登录后获取用于填充页面的用户数据的服务。我试图附加到rootScope的这些变量来自我们的构建,它将通过主机&amp;相对于生产或质量保证的港口参数。换句话说,我想根据环境构建应用程序时分配这些域。

1 个答案:

答案 0 :(得分:2)

  

我已将变量附加到运行块中的$ rootScope,但是   加载此html时似乎没有准备好。

当角度经过自举过程并创建$rootScope时,

$injector可用。可以通过ng-app指令或angular.bootstrap方法启动boostrapping过程。在任何情况下,必须在DOM准备就绪时调用它们,因为角度不能在没有DOM元素的情况下引导。 {<1}}块中的所有脚本都在 DOM准备好之前执行,因此您无法在此时访问head