I want to know what purpose the context parameter serves in createEmbeddedView() method in Angular. The online angular docs do not provide this information. 
For example I was reading this code where the author has made an iterator structural directive.
    import {
    Directive, ViewContainerRef, TemplateRef, Input, SimpleChange
} from "@angular/core";
@Directive({
    selector: "[paForOf]"
})
export class PaIteratorDirective {
    constructor(private container: ViewContainerRef, private template: TemplateRef<Object>) {
    }
    @Input("paForOf") dataSource: any;
    ngOnInit() {
        this.container.clear();
        for (let i = 0; i < this.dataSource.length; i++) {
            this.container.createEmbeddedView(this.template, new PaIteratorContext(this.dataSource[i]));
        }
    }
}
class PaIteratorContext {
    constructor(public $implicit: any) { }
}
This is shown on the checkbox checked event on the template like this:
    <div class="checkbox">
    <label><input type="checkbox" [(ngModel)]="showTable" />Show Table</label>
</div>
<table *paIf="showTable" class="table table-sm table-bordered table-striped">
    <tr>
        <th></th>
        <th>Name</th>
        <th>Category</th>
        <th>Price</th>
    </tr>
    <template [paForOf]="getProducts()" let-item>
        <tr>
            <td colspan="4">{{item.name}}</td>
        </tr>
    </template>
</table>
I want to understand this code:
this.container.createEmbeddedView(this.template, new PaIteratorContext(this.dataSource[i]));
Why i need to create an object of PaIteratorContext() class? why i can't just do this:
this.container.createEmbeddedView(this.template, this.dataSource[i]);
Please help ?
It's used to create a view using TemplateRef. TemplateRef is created by Angular compiler when it encounters ng-template tag in your component html. The view created using this method is called an embedded view .
TemplateRef is an embedded template which you can use in ViewContainerRef. createEmbeddedView to create Embedded View. *ngFor is doing the same, it reads the element as a TemplateRef and injects mutiple times to create view with data. TemplateRef cannot be used as an element for css decorations in .ts.
ViewContainerReflink. Represents a container where one or more views can be attached to a component.
TemplateReflink Represents an embedded template that can be used to instantiate embedded views. To instantiate embedded views based on a template, use the ViewContainerRef method createEmbeddedView() .
When you define a template you can have input parameters specified through let-paramname:
<template [paForOf]="getProducts()" let-item='item'>
     <span>{{item.name}}</span>
</template>
The context object is what allows you to pass those parameters to the template when creating it.
this.container.createEmbeddedView(this.template, {item: {name: 'John'}}`
Why i need to create an object of PaIteratorContext() class? why i can't just do this:
You don't have to create an instance of the PaIteratorContext, you just have to pass an object with the name property in that particular case. So the following will work as well:
this.container.createEmbeddedView(this.template, { $implicit: this.dataSource[i] });
If the input property is specified like this let-item without second part =something, the embedded view treats it as let-item=$implicit so you have to pass a context object with $implicit property.
If you pass {item: 'someValue'} then the stamped template can access the value using
<template let-foo="item"> 
  <div>{{foo}}</div>
</template>
or if you pass  {$implicit: 'someValue'}
<template let-foo> 
  <div>{{foo}}</div>
</template>
                        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