Какие провайдеры/сервисы доступны в модуле.config?
-
11-12-2019 - |
Вопрос
Я хочу использовать $document для получения значения сервера из поля ввода.
var base_url = $document[0].getElementById('BaseUrl').value;
Базовый URL-адрес используется для получения шаблонов.
var base_url = $document[0].getElementById('BaseUrl').value;
$routeProvider.when('/alert', {
controller: function () { },
templateUrl: base_url + '/partials/instances.html'
});
Поскольку $document выдает неизвестную ошибку, я предполагаю, что она недоступна в конфигурации?Есть ли способ узнать, что доступно, а что нет?Я также мог бы использовать $http для получения данных с сервера, но это тоже недоступно.
Решение
Модули AngularJS загружаются в два этапа:
Configuration phase
где доступны только провайдеры и константы.Run phase
где услуги создаются на основе зарегистрированных поставщиков.На этом этапе константы все еще доступны, но не поставщики.
AngularJS документация (раздел:«Загрузка модуля и зависимости») дает представление об этом:
Модуль представляет собой набор конфигурации и запускайте блоки, которые применяются к приложению во время процесса начальной загрузки.В самой простой форме модуль состоят из коллекции двух видов блоков:
Конфигурационные блоки - Получите выполнение на этапе регистрации и конфигурации поставщика.Только поставщики и константы могут быть введены в блоки конфигурации.Это должно предотвратить случайную экземпляр служб до того, как они будут полностью настроены.
Запуск блоков - Получите выполнение после создания инжектора и используется для начала приложения.Только экземпляры и константы могут быть введены в блоки пробега.Это для предотвращения дальнейшей конфигурации системы во время выполнения приложения.
Учитывая вышеизложенное, вы можете вводить только константы и провайдеры (отмеченные значком Provider
суффикс в документации API).Вероятно, это отвечает на ваш вопрос, но не помогает решить проблему с загрузкой шаблонов...
Интересно, нельзя ли просто использовать базовый тег в HTML, а затем просто использовать относительные пути (к базе), не указывая абсолютных путей?Вот вроде (при условии, что база правильно настроена):
$routeProvider.when('/alert', {
controller: function () { },
templateUrl: 'partials/instances.html'
});
Другие советы
Несмотря на то, что вопрос вообще ответил, вот небольшое добавление, ориентированное на конкретный пример, используемый в вопросе:
Как использовать угловую константу, чтобы определить BASEURL ваших частиц (или для определения других констант, представляющих значения сервера и делая их доступными для конфигурации):
// file: app.js
'use strict';
/* App Module */
angular.module( 'myApp', [] )
// define the templateBaseUrl
.constant( 'templateBaseUrl', 'themes/angular/partials/' );
// use it in configuration
.config(['$routeProvider','templateBaseUrl', function($routeProvider,templateBaseUrl) {
$routeProvider
.when( '/posts', {
templateUrl : templateBaseUrl + 'post-list.html',
controller : PostListCtrl
})
.when( '/posts/:postId-:slug', {
templateUrl : templateBaseUrl + 'post-view.html',
controller : PostViewCtrl
})
.when( '/about', {
templateUrl : templateBaseUrl + 'about.html',
controller : AboutPageCtrl
})
.when( '/contact', {
templateUrl : templateBaseUrl + 'contact.html',
controller : ContactPageCtrl
})
.otherwise({
redirectTo: '/posts'
})
;
}]);
.
На мой взгляд, это имеет несколько преимуществ:
- .
- Если вы переместите свои взгляды, вам нужно только обновить свой код в одном месте
- Если ваши частицы глубоко вложены в рамках планировки проекта, «TemplateBaseurl» не вызывает столько шума, так как весь путь
- Вы могли бы даже изменить между относительным и абсолютным путем
- Ответ на аналогичный вопрос предлагает использовать базовый элемент HTML Чтобы удалить потребность в предложении BaseURL к каждому TemplateURL. Но это также повлияло на все другие ресурсы на сайте. Настройка только базового URL для шаблонов не имеет побочных эффектов
Вообще, я не использую это решение с жестким кодированным значением, как выше. Это только пример, чтобы показать, что делать самым простым способом. Чтобы быть в состоянии скопировать свое приложение на своем сервере, определите значение за пределами App.js, в файле индекса и генерируйте необходимые пути сервера Server:
.// file: index.php <?php // only depends on your project layout $angularPartialsBaseUrl = 'themes/angular/partials/'; // this will change when you move the app around on the server $themeBaseUrl = $_SERVER['REQUEST_URI'] . 'themes/angular'; ?><!DOCTYPE html> <html ng-app="myApp"> <head> <title>Yii Blog Demo</title> <script> var myNS = myNS || {}; myNS.appConfig = myNS.appConfig || {}; myNS.appConfig.templateBaseUrl = '<?php echo $angularPartialsBaseUrl; ?>'; </script> <script src="<?php echo $themeBaseUrl; ?>/js/vendor/angular/angular.js"></script> <script src="<?php echo $themeBaseUrl; ?>/js/app.js"></script> </head> [...]
и в app.js:
.// file: app.js 'use strict'; /* App Module */ angular.module( 'myApp', [] ) // define the templateBaseUrl using external appConfig .constant( 'templateBaseUrl', myNS.appConfig.templateBaseUrl );