Angular Provider - $http не определен, когда $get возвращает объект

Если $get настроено так:

Конфиг:

.config( function( authProvider ){
    authProvider.initial();
})

Провайдер:

.provider('auth', function() {

  this.initial = function() {
    obj.user = JSON.parse( localStorage.getItem('user') );
  }

  var obj = {
    get: function() {
      return this.user;
    },
    set: function( userData ) {
      this.user = userData;
      localStorage.setItem( 'user', JSON.stringfiy( userData ) );
    },
    send: function( data ) {
      $http.post( 'user/' + data )
        .then(  res => {  //  Arrow Functions 
          this.set(res.data);
        };
    },    
  };

  this.$get = function( $http ) {
    return obj;
  }

})

я получил $http is not defined Ошибка - Когда send() призвание

И если это так:

.provider('auth', function() {

  // This method will not work !
  this.initial = function() {
    obj.user = JSON.parse( localStorage.getItem('user') );
  }

  this.$get = function( $http ) {
    return
    {
        get: function() {
          return this.user;
        },
        set: function( userData ) {
          this.user = userData;
          localStorage.setItem( 'user', JSON.stringfiy( userData ) );
        },
        send: function( data ) {
          $http.post( 'user/' + data )
            .then(  res => {  //  Arrow Functions 
              this.set(res.data);
            };
        }    
    };
  }
})

У меня нет ошибки

Но this.initial() Не работает.

потому что он не может получить доступ к объекту, который $get метод возврата..

Итак, мои вопросы:

  1. Почему в первом примере выдает ошибку вообще?

  2. Как я должен это делать?

Большое спасибо!

1 ответ

@estus находится в центре внимания проблемы службы / провайдера. Документы на провайдеров говорят нам, что когда провайдеры создаются, сервисы еще не существуют. А когда создаются сервисы, взаимодействие с поставщиками запрещено.

Из документов:

Во время начальной загрузки приложения, прежде чем Angular завершит создание всех служб, он настраивает и создает экземпляры всех поставщиков. Мы называем это этапом настройки жизненного цикла приложения. На этом этапе службы недоступны, поскольку они еще не созданы.

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

Похоже, вам нужно создать сервис / фабрику, а не провайдера, если вам нужен доступ к другим сервисам.


Кроме того, почему this.initial не будет работать, провайдер только выставляет то, что возвращается в $get метод.

Другие вопросы по тегам