I have dynamically added a component on the click of a button .
Below is the code for my widget . Simple div with color property being set as input.
Widget.tmpl.html
 div class="{{color}}" (click)="ChangeColor()"
In the Widget component i am taking color as my input . This component works fine when i add it manually . But now i am trying to dynamically add the component and also need to pass the Color Value to the Widget Component.
Below is the code in the app.component.ts where i am calling addItem() on the button click .
app.component.ts
export class AppComponent  {
  @ViewChild('placeholder', {read: ViewContainerRef}) viewContainerRef;
  private componentFactory: ComponentFactory<any>;
  constructor(componentFactoryResolver: ComponentFactoryResolver, compiler: Compiler) {
    this.componentFactory = componentFactoryResolver.resolveComponentFactory(MyAppComponent);
  }
  addItem () {
   this.viewContainerRef.createComponent(this.componentFactory, 0);
  }
 public  myValue:string = 'red';
 onChange(val: any) { this.myValue = val; } }
In the addItem() method i am dynamically adding my widget component to my view. The component gets added fine . But the problem is how to pass the color property when dynamically adding . Based on what color i pass when creating the widget i want it to be displayed in red or green etc. How to property bind in this scenario?
Here is some of the Code :
export class MyAppComponent { 
    @Input() color; 
    @Output('changes') result: EventEmitter<any> = new EventEmitter(); 
    public constructor() { 
    }
    ChangeColor() {
        this.ToggleColor();
        this.result.emit(this.color);// Emitting the color to the parent.        
    }
    ToggleColor() {
        if (this.color == "red")
            this.color = "blue";
        else
            this.color = "red";
    }
}
In the above code i am emitting my color to the parent app.component.ts but since i have dynamically added the widget component , i dont know where to add this code (changes)="onChange($event)". I tried to add this code in the div as shown below :
<div class="{{color}}" (click)="ChangeColor()" (changes)="onChange($event)"></div>
But it does not work.
var cmpRef = this.viewContainerRef.createComponent(this.componentFactory, 0);
cmpRef.instance.someProp = 'someValue';
cmpRef.instance.someObservable.subscribe(val => this.someProp = val);
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With