Angular: Почему я не могу ввести $ обеспечить напрямую в $ get?

0

Я предполагаю, что для этого есть простой (может быть, тривиальный) ответ, который я просто не обмотал.

Почему это делает то, что я хочу - то есть, вставлять ссылку на $provide в мою службу:

angular.module('error_reporting', [])
       .provider('RaygunLogger', function() {
           var provide = undefined;

           this.setProvide = function(p){
                provide = p;
           }

           this.$get = function() {
               // use $provide in p
           };
       })
       .config(function(RaygunLoggerProvider, $provide) {
           RaygunLoggerProvider.setProvide($provide);
       });

в то время как это приводит к ошибке формы Unknown provider: $provideProvider <- $provide <- RaygunLogger <- RaygunLogger?

angular.module('error_reporting', [])
       .provider('RaygunLogger', function() {
           this.$get = function($provide) {
                // use $provide
           };
       });

RaygunLogger.$get() ли RaygunLogger.$get() до того, как инжектор настроен? Я предполагаю, что это проблема порядка операций, когда мне нужно дождаться фазы конфигурации модуля, прежде чем я могу ввести $provide, но я не знаю, где это проверить в документе.

Теги:
dependency-injection

2 ответа

1
Лучший ответ

$provide доступ только во время фазы конфигурации. Функция $get запускается после фазы конфигурации, чтобы создать то, что предоставляет поставщик.

На данный момент вы не можете делать то, что вы пытаетесь сделать.

0

Чтобы использовать его внутри $get вы обычно запускаете свою функцию поставщика с помощью

var self = this;

и в определении $get (factory) вы используете self.

Например

angular.module('foo',[])
.provider('myFoo', function myFooProviderFn() {
    var self = this;
    self._debug = false;
    self.setDebug = function() { self._debug = true; }
    self.$get = ['$location', function($location) {
        self.setDebug();
    });
});

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

Больше из документов (рецепт поставщика)

  • 0
    Хранение копии this в self ничего не делает для предотвращения исключения Неизвестного провайдера, о котором я спрашиваю. Я хочу знать, почему я не могу ввести $provide непосредственно в $get ; Я не обеспокоен связыванием this внутри внутренних функций.
  • 0
    Экземпляр провайдера доступен только для angular на этапе конфигурирования ... не для других напрямую ... это сделано специально.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню