Любой поставщик DI должен быть включен в модуль во время компиляции.
Поскольку внедрение зависимостей Angular работает с символами/токенами типа Typescript, нет функциональности Javascript для выполнения той же задачи после ее компиляции.
Что вы можете сделать, так это динамически добавить поставщика во время компиляции, например:
import { Load, SomeToken } from '../someplace';
@NgModule({
declarations: [...],
imports: [...],
providers: [
{
provide: SomeToken,
useValue: Load(someVariable)
],
bootstrap: [...]
})
export class AppModule { }
а затем реализовать функцию Load и токен в другом месте:
export const SomeToken = new OpaqueToken<any>('SomeToken');
export const Load = (someVariable) => {
// logic to return an @Injectable here. Variable provided could be something like an environment variable, but it has to be exported and static
}
Этот подход, конечно, имеет ограничение, заключающееся в том, что его нужно знать во время компиляции. Другой подход заключается в глобальном импорте всех провайдеров, которые необходимы во всем приложении, независимо от обстоятельств, а затем в ленивой загрузке компонентов, в которых есть соответствующий провайдер, введенный для этого обстоятельства (Angular не будет инициализировать провайдера до тех пор, пока компонент, который его использует, не будет инициализирован), или создать поставщика, который сам по себе способен выполнять логику независимо от динамических критериев. Идея состоит в том, чтобы создать еще один сервис, который использует этот сервис и решает проблемы на основе этих динамических критериев (т. е. у вас может быть метод с именем GetLoginInfo
в первом сервисе, а второй сервис сможет разрешить правильный вызов API для этого метода.)
Если вам нужна только информация API (т. е. URL-адреса), то вы могли бы добиться вышеуказанного, захватив информацию URL-адреса из файла config.json или вызова API и внедрив эти значения в службу, чтобы вызовы и токены оставались прежними, но использовать разные значения. Подробнее о том, как это сделать, см. здесь.
person
joh04667
schedule
06.02.2018