0

二つのこと -

index.html の先頭に、環境固有の変数を渡したいベンダー スクリプトがあります。

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

run ブロックの $rootScope に変数をアタッチしましたが、この html がロードされたときに準備ができていないようです。同じコードをログに記録できます

<a data-ng-click="$log.log('code', code)">code</a>

しかし、ヘッドタグが実行されたときに準備ができていないようです。

また、解決の実行時に使用できない $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 にアタッチしようとしているこれらの変数はビルドからのもので、本番または QA に関連するホストとポートのパラメーターを渡します。つまり、環境に応じてアプリをビルドするときにこれらのドメインを割り当てたいと考えています。

4

1 に答える 1

2

run ブロックの $rootScope に変数をアタッチしましたが、この html がロードされたときに準備ができていないようです。

$rootScopeangular がブートストラップ プロセスを経て を作成するときに使用できます$injectorng-appブーストラップ プロセスは、ディレクティブまたはangular.bootstrapメソッドを介して開始できます。いずれにせよ、 angular は要素DOMなしでブートストラップできないため、これらは準備ができたら呼び出す必要があります。ブロック内DOMのすべてのスクリプトは、DOM の準備が整うに実行されるため、その時点でアクセスする方法はありません。head$rootScope

于 2016-10-19T20:03:13.493 に答える