Angular2 RC5 Межмодульный провайдер/сканирование

Я работаю над проектом, который в настоящее время является последним Angular RC5 и Material Design. Не то, чтобы последняя часть была актуальной.

Я начинаю создавать отдельные модули и отказываюсь от всего в основном модуле по понятным причинам. Однако мне нужны провайдеры, которые являются общими для всех модулей. F/E У меня есть служба, которая выполняет окончательное подключение к нашей внутренней системе. URL-адреса и т. д. для разных модулей устанавливаются у разных провайдеров. Все эти сервисы в настоящее время также являются частью отдельного проекта git, поскольку я также использую их в наших приложениях iOnic и других интерфейсах.

Итак, как мне пойти и получить этот сервис, который разделяет его экземпляр со всеми модулями, которые я создам для своего проекта?

Также я хотел бы создать панель инструментов, которая показывает «виджеты» из установленных/доступных модулей. Это также зависит от того, что пользователи могут видеть, очевидно. Симулятивные конструкции в Java будут разрешены с помощью сканирования / отражения компонентов. В Angular я бы предположил, что сделаю глобального доступного провайдера, где я мог бы добавить Type для размещения, который затем будет доступен на панели инструментов?

Эта последняя часть может быть сложной с модулями, поскольку все разделено, может ли кто-нибудь поделиться несколькими мыслями? В основном это два вопроса, но я считаю, что они должны разрешить очень похожий ответ.

Редактировать:

Итак, в моем случае я хотел бы знать о существующих маршрутах, это связано с другим вопросом, который я задал, но связан с этим.

Я хотел бы сделать что-то вроде этого

@NgModule({
  import:[
   BaseModule,
   someConstContainingRoutes
  ],

}) 
export class SubModuleWithRouting implements OnInit {
   //Import routeAuthService from BasicModule
   constructor(private routeAuthService: RouteAuthService){};

   ngOnInit() {
      this.routeAuthService.addRoutes(someConstContainingRoutes);
   }
}

Подобный шаблон не позволяет мне возиться с настройкой маршрутов в моем сервисе внутри основного компонента или w/e. Конечно, мы могли бы сделать это при первой загрузке или без нее, но это было бы неправильно.

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

Может уже есть такой крючок. Мой BaseModule ничего не узнает об этом модуле. Мои маршруты могут содержать определенные значения разрешений (которые являются просто перечислением). На хуке canActivate я хочу проверить это, поэтому я чувствую, что он должен знать о маршруте, поскольку я не могу получить его в хуке canActivate, и настройка его для каждого разрешения кажется глупой.


person Mathijs Segers    schedule 19.08.2016    source источник


Ответы (1)


Поставщики модулей предоставляются по всему миру.

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

Если вы хотите, чтобы поставщики лениво загружаемых модулей были добавлены глобально, используйте

static forRoot() в свой модуль и

export class SharedModule {
  static forRoot(): ModuleWithProviders {
    return {
      ngModule: SharedModule,
      providers: [ UserService ]
    };
  }
}

поэтому его можно импортировать с

 imports: [
    SharedModule.forRoot()
  ],

См. также https://angular.io/docs/ts/latest/guide/ngmodule.html#!#shared-module-for-root

person Günter Zöchbauer    schedule 19.08.2016
comment
Я не смог найти это в документах: как насчет того, чтобы провайдеры делились своим экземпляром? Это один и тот же экземпляр для всех модулей, которые их импортируют? Я думаю, тогда нет никакого способа избежать необходимости импортировать их повсюду? - person Mathijs Segers; 19.08.2016
comment
Я попробую этот Гюнтер, вопрос: можно ли что-то сделать со службой на модуле инициализации? Я хотел бы добавить свои маршруты в службу при загрузке, чтобы я мог правильно использовать их в canActivate или даже динамически отображать их в меню. - person Mathijs Segers; 22.08.2016
comment
Просто назначьте маршруты переменной (как это сделано в учебнике, на который я ссылался в своем ответе) и импортируйте файл, содержащий переменную, куда вам это нужно (помимо предоставления их маршрутизатору). - person Günter Zöchbauer; 22.08.2016
comment
Так что, вероятно, это невозможно в модуле? Или я мог бы даже выполнить OnInit для класса маршрутизатора и создать экземпляр службы? Это было бы круто. Затем я мог бы повторить этот шаблон для всех своих модулей. Иначе я бы не знал, куда его поставить, если честно. - person Mathijs Segers; 22.08.2016
comment
Не уверен, почему вы думаете, что вам нужен модуль для этого. Возможно, добавление к вашему вопросу кода, демонстрирующего, что вы пытаетесь выполнить, может помочь понять проблему. - person Günter Zöchbauer; 22.08.2016
comment
Я надеюсь, что это не слишком тарабарщина, может быть, вы понимаете, чего я действительно хочу. И я чувствую, что что-то вроде моего желания уже доступно. - person Mathijs Segers; 22.08.2016
comment
Вы не можете использовать imports: [] из NgModule для импорта маршрутов. Это только для импорта других NgModules. Вам понадобится обычный импорт TypeScript. - person Günter Zöchbauer; 22.08.2016
comment
Давайте продолжим обсуждение в чате. - person Mathijs Segers; 22.08.2016