Токен инъекции Angular (8) не разрешается в компоненте

avatar
Jeffrey Drake
8 августа 2021 в 20:16
42
0
0

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

Я создал интерфейс AppConfig и соответствующий ему токен:

export interface AppConfig {
   ...
}

export const APP_CONFIG = new InjectionToken<AppConfig>('APP_CONFIG');

Я пользуюсь услугой,

@Injectable({
    providedIn: 'root',
})
export class AppConfigService {
    private appConfigInternal: AppConfig | null;
    private generatedClient: GeneratedClient;

    constructor(injector: Injector) {
        this.generatedClient = injector.get(GeneratedClient);
        this.appConfigInternal = null;
    }

    get appConfig(): AppConfig {
        if (this.appConfigInternal != null) {
            return this.appConfigInternal;
        }

        throw new Error('Invalid retrieval of application config');
    }

    async load(): Promise<boolean> {
        // loads some properties asynchronously and fills in the app config, 
        // a false return indicates that it is a fundamental error and the application 
        // should be in an error state and not use the app config
        ...
    }

В моих поставщиках модулей приложений у меня есть:

        {
            provide: APP_INITIALIZER,
            useFactory: appConfigStartup,
            deps: [Injector],
            multi: true,
        },
        {
            provide: APP_CONFIG,
            useFactory: (injector: Injector): AppConfig => {
                const service = injector.get(AppConfigService);
                return service.appConfig;
            },
            deps: [Injector],
            multi: false,
        },

который использует функцию запуска:

const appConfigStartup = (injector: Injector) => async (): Promise<void> => {
    const appConfigService = injector.get(AppConfigService);

    const result = await appConfigService.load();

    if (result) {
        console.log('Application Config loaded');
    } else {
        console.log('Application Config not loaded');
    }
};

При отсутствии чего-либо в компоненте приложения в консоли отображается сообщение "Конфигурация приложения загружена".

Когда я пытаюсь добавить новый параметр в конструктор:

@Inject(APP_CONFIG) private appConfig: AppConfig

Там написано:

Can't resolve all parameters for AppComponent: ([object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], ?).

Я также пытался добавить поставщика в AppComponent без изменений.

Я подозреваю, что он пытается создать объект без запуска APP_INITIALIZER, поскольку сетевой вызов не выполняется.

Вероятно, я мог бы предоставить AppConfig непосредственно в качестве результата для Promise, но по устаревшим причинам я хотел иметь возможность использовать этот метод загрузки и предоставлять объект отдельно.

Но я точно не знаю, что здесь происходит.

Источник

Ответы (0)