Angular 8, как передать настройки на лениво загруженный модуль - PullRequest
0 голосов
/ 22 февраля 2020

Мне нужно передать провайдеров загруженному модулю Lazy. Контекст: у меня есть модуль, который обращается к API и возвращает некоторые конфиги для визуализации в компонентах. Это Модуль:

@NgModule({
  declarations: [AuxTablesComponent, AuxTablesListingComponent],
  providers: [AuxTablesService, AuxTableDataResolverGuard],
  imports: [CommonModule, AuxTablesRoutingModule, SharedModule]
})
export class AuxTablesModule {}

Импортирован как Ленивый на другой модуль:

const routes: Routes = [
      {
        path: AIRPORTS_ROUTES.AUX_TABLES.route,
        loadChildren: () => import('./aux-tables/aux-tables.module').then(m => m.AuxTablesModule)
      }
      ...
    ]
  }
];

@NgModule({
  imports: [RouterModule.forChild(routes)],
  exports: [RouterModule]
})
export class AirportsRoutingModule {}

Это работает как брелок. Но теперь мне нужен точно такой же модуль с такими же представлениями и поведением в другом модуле, но мне нужно сменить поставщиков, отвечающих за выборку данных из другого API. Поэтому я хотел бы изменить AuxTablesService и AuxTableDataResolverGuard.

Я пытался что-то вроде этого: импортировать его в другой модуль, в этом случае TrainsModule

const routes: Routes = [
      {
        path: TRAINS.AUX_TABLES.route,
        loadChildren: () => import('./aux-tables/aux-tables.module').then(m => m.AuxTablesModule
        .forChild(newApiProvider, newResolverGuard))
      }
      ...
    ]
  }
];

@NgModule({
  imports: [RouterModule.forChild(routes)],
  exports: [RouterModule]
})
export class TrainsRoutingModule {}

и подготовить AuxTablesModule для получить пользовательских провайдеров, как это:

@NgModule({
  declarations: [AuxTablesComponent, AuxTablesListingComponent],
  providers: [AuxTablesService, AuxTableDataResolverGuard],
  imports: [CommonModule, AuxTablesRoutingModule, SharedModule]
})
export class AuxTablesModule {
  static forChild(auxTableApiService: AuxTablesService, auxTableGuardResolver: Resolve<IAuxTable>) {
    return {
      ngModule: AuxTablesModule,
      providers: [
        {
          provide: AuxTablesService,
          useClass: auxTableApiService
        },
        {
          provide: AuxTablesService,
          useClass: auxTableGuardResolver
        }
      ]
    };
  }
}

Но когда angular пытается отрендерить ленивый модуль forChild, я получаю эту ошибку:

core. js: 6014 Ошибка ОШИБКИ: Uncaught (в обещании): Ошибка: не найдено метаданных NgModule для '[объект объекта]'.

Отладка angular, возвращаемый объект не является конструктором и не может быть "разложен" как модуль или не найден мета данные как @ngModule на нем. Кто-нибудь знает, как такое? Как предоставить пользовательские классы для лениво загруженных модулей?

1 Ответ

0 голосов
/ 22 февраля 2020

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

Получилось так:

@NgModule({
  declarations: [AuxTablesComponent, AuxTablesListingComponent],
  imports: [CommonModule, AuxTablesRoutingModule, SharedModule]
})
export class AuxTablesModule {}

Затем я передал провайдеры каждому модулю, который их импортирует:

@NgModule({
  declarations: [
   ...
  ],
  providers: [
    {
      provide: AuxTablesService,
      useClass: TrainsAuxTablesService
    },
    {
      provide: AuxTableDataResolverGuard,
      useClass: TrainAuxTableResolverGuard
    }
    ...
  ],
  imports: [...],
})
export class TrainsModule {}

и:

@NgModule({
  declarations: [
   ...
  ],
  providers: [
    {
      provide: AuxTablesService,
      useClass: AirPortsAuxTablesService
    },
    {
      provide: AuxTableDataResolverGuard,
      useClass: AirPortsAuxTableResolverGuard
    }
    ...
  ],
  imports: [...],
})
export class AirPortsModule {}

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

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

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