Я подключаю компонент кнопки (AddButtonComponent
) динамически к DOM другого компонента (ParentComponent
), используя Angular Material для стиля. Если я обычно создаю кнопки в шаблоне с <button matButton>A button</button>
, кнопка отлично стилизуется. Если я создаю его динамически, он тоже становится стилизованным.
Теперь мне нужно ввести строку, чтобы прикрепить имя класса к моей кнопке, но он теряет все стили, если я использую пользовательский Injector
. Я думаю, что когда я внедряю свою строку, она перекрывает текущие инъекции приложения этим инжектором.
Я пытался добавить инжектор ParentComponent
к атрибуту parent
, но он также не работал.
Что я делаю не так?
(Очевидно, я могу вызвать instance
из ElementRef
и установить значение атрибута, но это ужасно. Я считаю, что этого можно достичь.)
Вот пример кода:
import {
Component,
OnInit,
Optional,
Inject,
Injector,
InjectionToken,
ElementRef,
ViewContainerRef,
ComponentFactoryResolver,
} from '@angular/core';
export const CLASS_INJECTION: InjectionToken<string> = new InjectionToken<string>('ClassInjection');
@Component({
selector: 'app-add-button`,
template: '<button matButton [class]="classInjection">A button</button>',
styles: []
})
export class AddButtonComponent implements OnInit {
constructor(@Optional() @Inject(CLASS_INJECTION) public classInjection: string) { }
}
@Component({
selector: 'app-parent-component',
template: '<button matButton>Button styled</button>',
styles: []
})
export class ParentComponent implements OnInit {
constructor(
private _injector: Injector,
private componentFactoryResolver: ComponentFactoryResolver,
private viewContainerRef: ViewContainerRef
) { }
ngOnInit() {
const addButtonComponentFactory = this.componentFactoryResolver.resolveComponentFactory(AddButtonComponent);
const addButtonComponentRef = this.viewContainerRef.createComponent(addButtonComponentFactory, undefined, Injector.create({
providers: [{provide: ELEMENT_TYPE, useValue: widget.type === 'column' ? 'SECTION' : 'MODULE'}],
parent: this._injector
}));
// <Code to add element into DOM...>
}
}