Получить доступ к $rootScope в файле resol и root index.html

Две вещи -

В заголовке моего 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 в блоке run, служба сначала регистрируется как неопределенная, а затем, когда выполняется блок run, он был установлен правильно.

Что мне нужно сделать, чтобы использовать эти переменные в элементе заголовка корневого файла index.html и в разрешении?

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. Другими словами, я хочу назначить эти домены при сборке приложения в зависимости от среды.

1 ответ

Решение

Я прикрепил переменную к $rootScope в блоке выполнения, но она не выглядит готовой, когда загружается этот HTML.

$rootScope доступно, когда angular проходит процесс начальной загрузки и создает $injector, Процесс усиления может быть начат через ng-app директива или angular.bootstrap метод. В любом случае, они должны быть вызваны, когда DOM готов, потому что угловой не может загрузиться без DOM элемент. Все скрипты в head блоки выполняются до того, как DOM будет готов, и поэтому нет никакого способа получить доступ $rootScope в таком случае.

Другие вопросы по тегам