Open Coohack opened 8 years ago
可使用DynamicComponentLoader
对象手动渲染一个组件 源码在
src/core/linker/dynamic_component_loader.ts,提供了3种不同机制的load
不同平台global view
代表的内容不一样,在浏览器上global view
是Dom文档。
在global view
找到指定的selector
,渲染组件并插入到匹配selector
元素内部
将Dialog
组件插入class=".dialog"
的元素内部
dynamicComponentLoader.loadAsRoot(Dialog,'.dialog',injector);
结果
<app>
<div class="dialog">
Dialog...
</div>
</app>
loadAsRoot
是用于创建host element
, 所以在创建时需要传入injector
,通过这个injector
才能创建出host element
的injector
, 如果对Angular 2 分级依赖注入不了解的,可以看这篇翻译的官方文档
将组件插入到指定的elementRef
中的anchorName
后面
this.dynamicComponentLoader.loadIntoLocation(Dialog,elementRef,'dialog')
结果
<app>
<div #dialog></div>
Dialog...
</app>
将组件插入到指定的elementRef
对应的组件后面
this.dynamicComponentLoader.loadNextToLocation(Dialog,elementRef)
<app>
<div #dialog></div>
</app>
Dialog...
可以根据自己的需求使用不同的机制手动加载组件,加载组件全部是异步处理的,所以这3个方法都会返回一个promise
this.dynamicComponentLoader
.loadNextToLocation(Dialog,elementRef)
.then((containerRef)=>{
})
import {Component,DynamicComponentLoader,ElementRef} from 'angular2/core';
@Component({
selector: 'dialog',
directives: [],
template: `
<p>dialog</p>
`,
})
export class Dialog {
}
@Component({
selector: 'app',
template: `
<button (click)="loadAsRoot()">loadAsRoot</button>
<button (click)="loadIntoLocation()">loadIntoLocation</button>
<button (click)="loadNextToLocation()">loadNextToLocation</button>
<div class="dialog" #dialog>
</div>
`,
})
export class App {
constructor(public dynamicComponentLoader:DynamicComponentLoader,
public injector:Injector,
public elementRef:ElementRef) {
}
loadAsRoot() {
this.dynamicComponentLoader.loadAsRoot(Dialog, '.dialog', this.injector);
}
loadIntoLocation() {
this.dynamicComponentLoader.loadIntoLocation(Dialog,this.elementRef,'dialog')
}
loadNextToLocation() {
this.dynamicComponentLoader.loadNextToLocation(Dialog,this.elementRef)
}
}
thanks a lot
请问手动渲染的组件 如何销毁呢
如题:angular2如何手动渲染一个组件