Каким образом сервисы попадают в область действия функции конфигурации?

Я очень хорошо прочитал этот пост

Какие вещи можно вводить другим в Angular.js?

и мне было любопытно, так как мне сказали использовать свойство resolve для создания xhr и использовать службы для помощи с этими вызовами. Как работает свойство resolve в этом коде? В какой момент вызывается инжектор $?

app.config(function($stateProvider){
  $stateProvider
    .state("eventIndex", {
      url: "/events", 
      views: {
        "main": {
          controller: "EventsCtrl",
          templateUrl: "assets/events/index.html"
        }
      },
      resolve: {
        events: ['EventService', function(Event){
                  return Event.allEvents()
                  }
                ]
       }
    });
});

person jvans    schedule 08.09.2013    source источник


Ответы (1)


Если ваш вопрос: какая часть кода должна вызываться $injector?

Ответ: функция config, функция events (хотя технически она объявлена ​​в вашем коде как массив, с точки зрения AngularJS, это аннотированная функция) и функция EventsCtrl.

Если ваш вопрос: когда вызывается метод resolve()?

Ответ: ui-router сначала срабатывает $stateChangeStart, и у вас есть возможность отменить навигацию; в противном случае он попытается разрешить все объекты, объявленные в resolve, путем вызова $injector.invoke() и получения обратно обещаний (в противном случае они будут заключены в обещания).

Как только все обещания выполнены (или отклонены), ui-router пользователи $injector вызывают onExit предыдущего состояния и onEnter текущего состояния перед запуском $stateChangeSuccess (или $stateChangeError в случае отклонения).

Директива ui-view прослушивает $stateChangeSuccess, чтобы загрузить представление, создать экземпляр контроллера с поставщиком $controller (который внутренне использует $injector.instantiate, который, в свою очередь, использует $injector.invoke для создания экземпляра контроллера).

person Buu Nguyen    schedule 08.09.2013
comment
Ах, хорошо, пока $ injector.invoke () никогда не запускается для функций app.config, он запускается для свойства разрешения функции конфигурации. Спасибо за такой ответ, многому научился! - person jvans; 08.09.2013
comment
$ injector.invoke действительно используется для выполнения app.config, но это очень рано в цикле (во время загрузки модуля). Кроме того, инжектор $, используемый для config (), отличается от обычного инжектора $, это инжектор поставщика $ (так что вы можете вводить только провайдеров, а не экземпляры провайдеров). Разрешение состояния происходит намного позже, то есть после того, как $ locationChangeSuccess запущен поставщиком $ location. По сути, любой метод, в котором вы объявляете зависимости, выполняется с помощью $ injector.invoke (). - person Buu Nguyen; 08.09.2013