Det*_*iel 5 typescript angular
首先,Plunker中提供了所有代码.
我有一个根Angular2组件,如下所示:
import {Component} from '@angular/core'
@Component({
selector: 'my-app',
template: `
<h2>Angular2 Root Component</h2>
<div data-dynamic-content></div>
`,
})
export class App {}
Run Code Online (Sandbox Code Playgroud)
该[data-dynamic-content]元素是我将在运行时添加的组件的占位符.这些组件也是动态的,创建如下:
import {Component} from '@angular/core'
export function createComponent(selector: string, value: string) {
@Component({
selector: selector,
template: `<h4>Dynamic Component: {{v}}</h4>`,
})
class MyDynamicComponent {
v = value;
}
return MyDynamicComponent;
};
Run Code Online (Sandbox Code Playgroud)
请记住,这是一个极其简化的例子.
我想创建不同的表示形式MyDynamicComponent,将它们附加到[data-dynamic-content]元素树中,并使它们具有全部功能.
到目前为止唯一有效的方法是在追加到DOM时引导新创建的组件:
import {bootstrap} from '@angular/platform-browser-dynamic';
import {createComponent} from './my-dynamic.component';
export function addComponentDynamically(selector, value) {
var dynamicComponent = createComponent(selector, value);
var container = document.querySelector('[data-dynamic-content]');
var wrapper = document.createElement("div");
wrapper.innerHTML = `<${selector}></${selector}>`;
container.appendChild(wrapper);
// !! won't work without this line
bootstrap(dynamicComponent);
};
Run Code Online (Sandbox Code Playgroud)
我也玩过DynamicComponentLoader.看起来它不符合我的需求 - DynamicComponentLoader.loadNextToLocation需要一个ViewContainerRef参数(例如,你应该事先知道你的组件将在哪里),而我没有这个.正如我之前提到的,MyDynamicComponent可以在元素树中的任何位置呈现[data-dynamic-content],不一定在此元素本身中.
虽然这有效,但我非常怀疑这种方法是否具有可扩展性(在Chrome中测试了1000个更复杂的组件 - 内存消耗达到峰值约750 MB,然后降低到约400 MB).
有没有比bootstrap一次又一次地调用更好的方法来完成这项工作?
| 归档时间: |
|
| 查看次数: |
4271 次 |
| 最近记录: |