:
1) Angular ComponentFactory
windowCmpFactory.create(this._injector, [[contentCmpt.location.nativeElement]]);
1.1 - , Angular
const value = startView.root.injector.get(depDef.token, NOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR);
. .

. doc
1.2 node, "" () ng-content, .
-, ng-content node.
@Component({
selector: 'modal-window',
template: `
<div class="modal-dialog">
<div class="modal-content">
<ng-content></ng-content> // <== place for projection
</div>
</div>
`
})
export class ModalWindow {
:
<modal-window>
<modal-content></modal-content>
<div>Some other content</div>
</modal-window>
, :
<modal-window>
<div class="modal-dialog">
<div class="modal-content">
<modal-content></modal-content> // our projectable nodes
<div>Some other content</div> // replaced ng-content
</div>
</div>
</modal-window>
,
windowCmpFactory.create(this._injector, [[contentCmpt.location.nativeElement]]);
, .
(contentCmpt.location) contentCmpt. modal-content. Angular , ng-content.
div
<modal-window>
<modal-content></modal-content>
<div>Some other content</div> <== here
</modal-window>
, :
let div = document.createElement('div');
div.textContent = 'Some other content';
windowCmpFactory.create(this._injector, [[contentCmpt.location.nativeElement, div]]);
projectableNodes [] []?
2)
document.querySelector('body').appendChild(windowCmpt.location.nativeElement);
modal-window. ComponentRef , location getter
export abstract class ComponentRef<C> {
abstract get location(): ElementRef;
document.body . .
3). , ModalContent , .
@Component({
selector: 'modal-content',
template: `
I'm beeing opened as modal! {{ counter }}
<button (click)="counter = counter + 1">Increment</button>
`
})
export class ModalContent {
counter = 1;
}
this._appRef.attachView(contentCmpt.hostView);
, ComponentFactory.create, - ( ViewContainerRef.createComponent). Angular API , root views https://github.com/angular/angular/blob/master/packages/core/src/application_ref.ts#L428, Application.tick https://github.com/angular/angular/blob/master/packages/core/src/application_ref.ts#L558