Главный вопрос - возможно ли это? Я безуспешно пытался ..
основной app.js
...
var app = angular.module('myApp', ['services']);
app.config(['customProvider', function (customProvider) {
}]);
...
сам провайдер
var services = angular.module('services', []);
services.provider('custom', function ($http) {
});
И у меня такая ошибка:
Uncaught Error: Unknown provider: $http from services
Любые идеи?
Благодарность!
javascript
angularjs
angular-services
Косметика
источник
источник
app.config
частиОтветы:
Итог:
Детали:
Angular framework имеет двухэтапный процесс инициализации:
ФАЗА 1: Конфигурация
На этом
config
этапе инициализируются все поставщики и выполняются всеconfig
разделы. Вconfig
секции может содержать код , который конфигурирует объекты провайдера и , следовательно , они могут быть введены с объектами провайдера. Однако, поскольку провайдеры являются фабриками для сервисных объектов, и на этом этапе провайдеры не полностью инициализированы / настроены -> вы не можете попросить провайдера создать сервис для вас на этом этапе -> на стадии конфигурации вы не можете использовать / инъекционные услуги . Когда этот этап завершен, все поставщики готовы (после завершения этапа конфигурации больше нельзя будет выполнить настройку поставщика).ФАЗА 2: Бег
Во время
run
фазыrun
выполняются все разделы. На этом этапе поставщики готовы и могут создавать службы -> наrun
этапе вы можете использовать / вводить службы .Примеры:
1. Внедрение
$http
сервиса в функцию инициализации провайдера НЕ БУДЕТ работатьПоскольку мы пытаемся внедрить
$http
службу в функцию, которая выполняется наconfig
этапе, мы получим ошибку:На самом деле эта ошибка означает, что объект,
$httpProvider
который используется для создания$http
службы, еще не готов (поскольку мы все еще находимся вconfig
фазе).2. Введение
$http
сервиса в функцию инициализации сервиса БУДЕТ работать://OK angular.module('myModule').provider('myProvider', function() { // SECTION 1: code to initialize/configure the PROVIDER goes here (executed during `config` phase) ... this.$get = function($http) { // code to initialize/configure the SERVICE goes here (executed during `run` stage) return myService; }; });
Поскольку сейчас мы внедряем службу в функцию инициализации службы, которая выполняется на
run
этапе, этот код будет работать.источник
<script>var config = <% = mySettings.toJson() %>;</script>
). Это можно сделать с помощью механизма шаблонов, такого как Smarty для PHP, Jinja2 для Python, Nunchucks для NodeJS и т. Д.Это может дать вам небольшое преимущество:
var initInjector = angular.injector(['ng']); var $http = initInjector.get('$http');
Но будьте осторожны, обратные вызовы успеха / ошибки могут держать вас в состоянии гонки между запуском приложения и ответом сервера.
источник
angular.injector(['mymodule'])
таково, но я не уверен, что вы можете использовать этот подход для$http
службы. Я хочу сказать, что у меня есть. Не уверен, помогает это или нет: - /Это старый вопрос, кажется, у нас что-то происходит с куриным яйцом, если мы хотим полагаться на основные возможности библиотеки.
Вместо того, чтобы решить проблему фундаментальным образом, я обошел стороной. Создайте директиву, охватывающую все тело. Ex.
<body ng-app="app"> <div mc-body> Hello World </div> </body>
Теперь
mc-body
необходимо инициализировать перед рендерингом (один раз), например.link: function(scope, element, attrs) { Auth.login().then() ... }
Auth
является услугой или поставщиком, напр..provider('Auth', function() { ... keep your auth configurations return { $get: function($http) { return { login: function() { ... do something about the http } } } } })
Мне кажется, что у меня есть контроль над порядком начальной загрузки, это происходит после того, как обычная начальная загрузка разрешает всю конфигурацию поставщика, а затем пытается инициализировать
mc-body
директиву.И эта директива, как мне кажется, может опережать маршрутизацию, потому что маршрутизация также вводится через директиву ex.
<ui-route />
. Но я могу ошибаться в этом. Требуется дополнительное расследование.источник
На ваш вопрос «Есть идеи?» Я бы ответил «да». Но подождите, это еще не все!
Я предлагаю просто использовать JQuery в конфиге. Например:
var app = angular.module('myApp', ['services']); app.config(['$anyProvider', function ($anyProvider) { $.ajax({ url: 'www.something.com/api/lolol', success: function (result) { $anyProvider.doSomething(result); } }); }]);
источник