Подтвердить что ты не робот

Какие провайдеры/службы доступны в модуле .config?

Я хочу использовать $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 выдает ошибку, которая неизвестна, я предполагаю, что она недоступна в config? Есть ли способ узнать, что доступно, а что нет? Я мог бы также использовать $http для получения данных с сервера, но это также не доступно.

4b9b3361

Ответ 1

Модули AngularJS загружаются в 2 фазы:

  • Configuration phase, где доступны только поставщики и константы.
  • Run phase, где службы создаются на основе зарегистрированных поставщиков. В этой фазе постоянные все еще доступны, но не поставщики.

Документация AngularJS (раздел "Загрузка модуля и зависимости" ) дает представление об этом:

Модуль представляет собой набор конфигураций и блоков запуска, которые получают применяется к приложению во время процесса начальной загрузки. В своем Простейшая форма модуля состоит из набора двух видов блоков:

Блоки конфигурации - выполняются во время регистрации провайдера и фазе конфигурации. Могут быть введены только поставщики и константы в конфигурационные блоки. Это делается для предотвращения случайного создания экземпляра услуг, прежде чем они будут полностью настроены.

Запустить блоки - получить выполняются после создания инжектора и используются для запуска выражение. Только экземпляры и константы могут быть введены в действие блоки. Это необходимо для предотвращения дальнейшей конфигурации системы во время время выполнения приложения.

Учитывая вышеизложенное, вы можете вводить константы и провайдеры (помеченные суффиксом Provider в документах API). Вероятно, это ответ на ваш вопрос, но не помогает решить вашу проблему загрузки шаблонов...

Интересно, не можете ли вы просто использовать базовый тег в HTML, а затем просто использовать относительные пути (к базе) без указания абсолютных путей? Sth like (при условии, что база настроена правильно):

$routeProvider.when('/alert', {
  controller: function () { },
  templateUrl: 'partials/instances.html'
});

Ответ 2

Хотя на вопрос, как правило, ответили, здесь небольшое дополнение, нацеленное на конкретный пример, используемый в вопросе:

Как использовать константу angular, чтобы определить 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 к каждому шаблонуUrl. Но это также повлияло на все другие ресурсы на веб-сайте. Настройка только базового url для шаблонов не имеет побочных эффектов

Как правило, я не использую это решение с жестким кодированным значением, как указано выше. Это всего лишь пример, чтобы показать, что делать самым простым способом. Чтобы иметь возможность копировать приложение на своем сервере, определите значение вне app.js в вашем индексном файле и сформируйте необходимую сторону сервера:

// 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 );