Size: a a a

2021 January 27

A

Antony in Angular Kyiv
Всем привет, кто-то знает как можно решить такую задачу?
Мы экспортим модуль ExportedModule внутри которого есть импорт другого модуля с конфигурацией в forRoot
imports:[ UiLibraryModule.forRoot({someUrl: ‘someUrl123’})]
Как сделать так что бы можно передавать в ExportedModule переменную (в нашем случае это строка текущего environment) основываясь на которой мы могли бы менять значение ‘someUrl’ на этапе сборки?
источник

G

George in Angular Kyiv
Antony
Всем привет, кто-то знает как можно решить такую задачу?
Мы экспортим модуль ExportedModule внутри которого есть импорт другого модуля с конфигурацией в forRoot
imports:[ UiLibraryModule.forRoot({someUrl: ‘someUrl123’})]
Как сделать так что бы можно передавать в ExportedModule переменную (в нашем случае это строка текущего environment) основываясь на которой мы могли бы менять значение ‘someUrl’ на этапе сборки?
Пробовал сделать forRoot  для своего модуля и там подключить провайдеры с помощью forRoot из библиотеки?
источник

A

Antony in Angular Kyiv
George
Пробовал сделать forRoot  для своего модуля и там подключить провайдеры с помощью forRoot из библиотеки?
Но мне же надо засетить не провайдер а строку для forRoot другого модуля.
Условно у меня будет такой ExportedModule

@NgModule({
 imports: [
   UiLibraryModule.forRoot({someUrl: ‘someUrl123’})
 ]
})
export class ExportedModule {
 static
withConfig(
   factory: (...deps: any[]) => Environment,
   deps?: any[]
 ): ModuleWithProviders {
   return {
     ngModule: ExportedModule,
     providers: [{ provide:
ENVENV, useFactory: factory, deps }],
   };
 }
}

и я не понимаю как мы можем сделать someUrl зависимой от значение ENVENV
источник

A

Antony in Angular Kyiv
Я вижу здесь вариантом только просить условный UiLibraryModule тоже сделать forRoot или withConfig который будет ожидать что-то по инжекшен токену
источник

G

George in Angular Kyiv
Antony
Но мне же надо засетить не провайдер а строку для forRoot другого модуля.
Условно у меня будет такой ExportedModule

@NgModule({
 imports: [
   UiLibraryModule.forRoot({someUrl: ‘someUrl123’})
 ]
})
export class ExportedModule {
 static
withConfig(
   factory: (...deps: any[]) => Environment,
   deps?: any[]
 ): ModuleWithProviders {
   return {
     ngModule: ExportedModule,
     providers: [{ provide:
ENVENV, useFactory: factory, deps }],
   };
 }
}

и я не понимаю как мы можем сделать someUrl зависимой от значение ENVENV
@NgModule({
 imports: [UiLibraryModule]
})
export class ExportedModule {
 static withConfig(url: string): ModuleWithProviders {
      return {
          ngModule: ExportedModule,
          providers:[
UiLibraryModule.forRoot({someUrl: url).providers })
]
       }
 }
}
источник

A

Antony in Angular Kyiv
George
@NgModule({
 imports: [UiLibraryModule]
})
export class ExportedModule {
 static withConfig(url: string): ModuleWithProviders {
      return {
          ngModule: ExportedModule,
          providers:[
UiLibraryModule.forRoot({someUrl: url).providers })
]
       }
 }
}
Вау, не знал что так можно, спасибо!
источник

G

George in Angular Kyiv
Antony
Вау, не знал что так можно, спасибо!
а почему ты в самом ExportedModule не сетишь URL из env? Зачем тебе еще 1 модуль?
источник

A

Antony in Angular Kyiv
George
а почему ты в самом ExportedModule не сетишь URL из env? Зачем тебе еще 1 модуль?
ExportedModule это библиотека которая хочет принимать env от проекта в который будет импортнута
источник

Sergey Фrolov in Angular Kyiv
Скорее всего там внутри этой либы есть рутовый сервис, который этот урл и переваривает. В целом можно попробовать именно через него обойти.
Так как выше все равно связываение статическое, через DI там url не пробрасывается.
А сам forRoot можно сделать и через environment
источник

A

Antony in Angular Kyiv
Sergey Фrolov
Скорее всего там внутри этой либы есть рутовый сервис, который этот урл и переваривает. В целом можно попробовать именно через него обойти.
Так как выше все равно связываение статическое, через DI там url не пробрасывается.
А сам forRoot можно сделать и через environment
Ты имеешь ввиду запровайдить в ExportedModule то что внутри UiLibraryModule использует someUrl?
источник

G

George in Angular Kyiv
Sergey Фrolov
Скорее всего там внутри этой либы есть рутовый сервис, который этот урл и переваривает. В целом можно попробовать именно через него обойти.
Так как выше все равно связываение статическое, через DI там url не пробрасывается.
А сам forRoot можно сделать и через environment
где-то на середине потерял твою мысль )))
источник

Sergey Фrolov in Angular Kyiv
George
где-то на середине потерял твою мысль )))
Я к тому, что вообще не понял зачем это все.
Явно же forRoot должна подключатся в App, иначе это все теряет смысл.
Также я не понял, что там будет меняться на этапе сборки. Какой сборки и что нужно менять в зависимости от переменной?
источник

G

George in Angular Kyiv
Sergey Фrolov
Я к тому, что вообще не понял зачем это все.
Явно же forRoot должна подключатся в App, иначе это все теряет смысл.
Также я не понял, что там будет меняться на этапе сборки. Какой сборки и что нужно менять в зависимости от переменной?
1. Это вариант подключения библиотеки, которая “под капотом” использует другую библиотеку.
2. Твой вариант, на мой взгляд, лучше, если внешняя библиотека экспортирует токен для конфигурации - тогда все по классике))
3. Как я понял урла “зашита” в енв файле, поэтому она определяется при билде. Но тут это не принципиально - ее и в токен можно переложить
источник

Sergey Фrolov in Angular Kyiv
Вот про 3 я не понял. Как ты в токен переложишь, если нет доступа к модулю? А если имеешь, то конечно явно нужно делать токен и через него настройку в сервис, который в том же forRoot
источник
2021 January 28

Sergey Фrolov in Angular Kyiv
George
1. Это вариант подключения библиотеки, которая “под капотом” использует другую библиотеку.
2. Твой вариант, на мой взгляд, лучше, если внешняя библиотека экспортирует токен для конфигурации - тогда все по классике))
3. Как я понял урла “зашита” в енв файле, поэтому она определяется при билде. Но тут это не принципиально - ее и в токен можно переложить
Но проброс я оценил, интересная штука у тебя. Правда еще вроде остаются imports/компоненты/exports из этого forRoot модуля, их тоже же нужно заимпортить
источник

G

George in Angular Kyiv
как запровайдить переменную из енв файла?
{ provide: ENV_URL, useValue: env.url }
источник

G

George in Angular Kyiv
только если 3rd party модуль не экспортирует токен для конфигурации его значение не переопределишь или не расширишь.
источник

G

George in Angular Kyiv
у них внутри forRoot (скорее всего) что-то такое тоже
{ provide: URL, useValue: appUrl }
источник

G

George in Angular Kyiv
если URL из пакета не экспортируется - считай это приватное апи
источник

Sergey Фrolov in Angular Kyiv
George
только если 3rd party модуль не экспортирует токен для конфигурации его значение не переопределишь или не расширишь.
Да, я как раз про это. Но очень вряд ли, что это 3rd party
источник