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

StackOverflow https://stackoverflow.com//questions/12664787

  •  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 );
    
    .

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top