I'm trying to dynamically update inputs of my Angular components using ViewContainerRef.createComponent.
Currently, my components inherit input signal properties from this directive:
@Directive()
export abstract class BaseWidget<TData> {
data = input<TData>();
widgetSize = input<Size>(Size.S);
selectedLocation = input<string>('');
timeslot = input<TimeSlot | null>(null);
@ViewChild('footer') footer!: TemplateRef<any> | null;
}
every components inherits properties like this:
export class MyComponent extends BaseWidget<MyComponentData> {}
In my container, I load the component dynamically:
const componentRef = viewContainerRef.createComponent(componentType);
componentRef.setInput('data', widgetConfig.data);
componentRef.setInput('widgetSize', this.widgetSize);
componentRef.setInput('timeslot', this.getWidgetInfoByType(this.widgetType).timeSlot);
componentRef.setInput('selectedLocation', widgetConfig.selectedLocation);
This works, but in the component, the inputs are normal properties, so they are accessed like:
this.widgetSize // not this.widgetSize()
Goal
I want the inputs to become InputSignals using Angular’s input(), so that I can read them as functions:
this.widgetSize() // instead of this.widgetSize
Problem
input() creates a readonly InputSignal
Question
Is there a way in Angular to:
Declare component inputs as InputSignals (this.widgetSize())
Update them dynamically from a container using createComponent
Or do you always have to choose between readonly InputSignals and normal properties when using dynamic components?