Angular 2 - разрешить компонент Factory с помощью строки

Это для 2.1.0 окончательных версий версии Angular.

Я пытаюсь динамически создать экземпляр компонента, тип которого передается из файла конфигурации JSON. Лучшее, что я могу найти, - это ComponentFactoryResolver, однако все используемые вами методы, которые я нашел, сохраняют, похоже, передают фактическим объектам Type в распознаватель.

Есть ли способ получить Type из строки? Поскольку в настоящее время передача типа в виде строки дает мне ошибку:

No component factory found for MyComponent

Соответствующий код:

Компонент StructureBuilder:

private renderComponent(config:any) {
    let configComponents = config.components;
    if(config.hasOwnProperty('components') && configComponents.length){
        for(let i = 0, len = configComponents.length; i < len; i++){
            this.componentResolver.resolveComponentFactory(configComponents[i]);
        }
    }
}

где config.components - это массив строк, которые используют Type как значение.

И в определении модуля (Structure.module.ts)

@NgModule({
    declarations: [
        MyComponent,
        StructureBuilder_Cmp
    ],
    entryComponents: [
        MyComponent
    ]
    //Etc...
});

Насколько это возможно с помощью разреженных документов, это именно то, как вы должны это делать.

Если я изменяю динамическую строку, переданную с configComponents[i], на фактическую ссылку на импортированный тип для MyComponent, она работает.

Итак, в основном, вопрос: Есть ли способ использовать resolveComponentFactory со строками для решения компонента, а если нет, есть ли способ получить ссылку Type из строкового значения?

Ответ 1

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

let componentRegistry = {
    'SomeComp1': SomeComp1, 
    'SomeComp2': SomeComp2
}

И затем назовите его с помощью:

private renderComponent(config:any) {
    let configComponents = config.components;
    if(config.hasOwnProperty('components') && configComponents.length){
        for(let i = 0, len = configComponents.length; i < len; i++){
            let comp = configComponents[i];
            this.componentResolver.resolveComponentFactory(this.componentRegistry[comp]);
        }
    }
}