Получение и реагирование на параметры маршрута в FactoryProvider - PullRequest
0 голосов
/ 27 ноября 2018

Я хочу использовать FactoryProvider , который получает выбирает реализацию службы на основе текущего URI.

Кроме того, одна из реализаций должна реагировать на параметры маршрута (как определено route/:parameter).

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

Есть что-то, что я мог пропустить?

код модуля (сокращенно для улучшения читаемости)

@NgModule({
  declarations: [],
  imports: [],
  exports: [],
  providers: [XServiceProvider],
  entryComponents: []})

Фабричный поставщик

export const XServiceProvider = {
    provide: XService,
    useFactory: XServiceFactory,
    deps: [Http, HttpService, ConfigurationService, DatePipe, Router, ActivatedRoute]
  };

const XServiceFactory = (http: Http,
                               httpService: HttpService,
                               configuration: ConfigurationService,
                               datePipe: DatePipe,
                               router: Router,
                               activatedRoute: ActivatedRoute) => {

   const useAlternateImpplementation= router.url.startsWith('/mg/');


if (useAlternateImpplementation === true) {
    const service = new XyService(http, httpService, configuration, datePipe);

for (const child of activatedRoute.root.children) {
        if (child.outlet === PRIMARY_OUTLET) {
            child.url.subscribe(params => {
                 service.setParam(params[parameter]);
             });
        }
    }
    return service;
  }
  return new XService(http, httpService, configuration, datePipe);
};

1 Ответ

0 голосов
/ 03 декабря 2018

Решил проблему, изменив область внедрения зависимостей с Singleton на Transient.

Вот как:

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

Пример кода:

@NgModule({
    declarations: [],
    exports: [],
    providers: [ /* remove here! */ ]
})
//...

@Component({
  selector: '...',
  templateUrl: '...',
  styleUrls: ['...'],
  providers: [XServiceProvider] /* add here */
})
//...

Вот (вероятно) почему:

  • Службы, которые объявлены как module-Широкие провайдеры создаются один раз за создание приложения.Таким образом, вы не можете загрузить приложение, использовать реализацию службы один, изменить контекст, использовать реализацию два.
  • Объявление провайдеров для каждого компонента приводит к изменению этого шаблона.Компоненты создаются и уничтожаются на основе маршрутизации.Тем не менее, другой маршрут может теперь привести к другой реализации.

Я был вдохновлен сообщением в блоге , чтобы попробовать это.

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

...