我有經由到HTML服務注入任何成分的工作代碼:Angular - 服務注入動態組件?
ModalWindow.ts:
@Component({
selector: 'modal-window'
template: `
<div class="modal-dialog" role="document">
<div class="modal-content"><ng-content></ng-content></div>
</div>
`
})
export class ModalWindow {
}
Modalcontent.ts:
@Component({
selector: 'modal-content'
template: `
I'm beeing opened as modal!
`
})
export class ModalContent {
}
ModalService 。:
/*1*/ @Injectable()
/*2*/ export class ModalService {
/*3*/
/*4*/ constructor(private _appRef: ApplicationRef, private _cfr: ComponentFactoryResolver, private _injector: Injector) {
/*5*/ }
/*6*/
/*7*/ open(content: any) {
/*8*/ const contentCmpFactory = this._cfr.resolveComponentFactory(content);
/*9*/ const windowCmpFactory = this._cfr.resolveComponentFactory(ModalWindow);
/*10*/
/*11*/ const contentCmpt = contentCmpFactory.create(this._injector);
/*12*/ const windowCmpt = windowCmpFactory.create(this._injector, [[contentCmpt.location.nativeElement]]);
/*13*/
/*14*/ document.querySelector('body').appendChild(windowCmpt.location.nativeElement);
/*15*/
/*16*/ this._appRef.attachView(contentCmpt.hostView);
/*17*/ this._appRef.attachView(windowCmpt.hostView);
/*18*/ }
/*19*/ }
App.ts:
@Component({
selector: 'my-app',
template: `
<button (click)="open()">Open modal window</button>
`,
})
結果(點擊一個按鈕調用該服務的方法時):
我已經知道contentCmpFactory
和windowCmpFactory
是(行#8,9)
但是我不認爲以後會發生什麼。關於第#11,第12行 - 文檔說「創建了一個新組件」。
問題:
1 - 線#12:什麼是[[contentCmpt.location.nativeElement]]
辦? (的文檔說,它的類型是projectableNodes?: any[][]
- 這是什麼意思?)
2 - 線#14:什麼是[[windowCmpt.location.nativeElement]]
辦?
3行#16,#17:如果我已經做了appendChild
,那麼爲什麼需要它們? (docs說:附加一個視圖,以便它會被檢查髒。 - 所以?)。
♡♡一如既往....謝謝。多好的答案。 –
@yuruzi,但如果我有兩個(名爲'ng-content select = ...')ng內容,我該如何映射每個部分('header'到第一個ng-content,'body'到第二個ng-content)? https://plnkr.co/edit/ozjVRwM3VMzNVErbH92O?p=preview –
'[contentCmpt.location.nativeElement.children]'https://plnkr.co/edit/UnahRZEVa0diSxnKH3D8?p=preview – yurzui