Angular RC 2 - 从 json 文件动态渲染组件
Angular RC 2 - Dynamically Render Components from a json file
DynamicComponentLoader 已被弃用。我正在尝试构建一个 parent 组件,它根据 child 组件数组在 parent 组件内部呈现 child 组件,这意味着每个用户都有一个设置文件包含需要在 parent 中的 child 个组件。现在 parent 看起来像这样:
import { Component, OnInit, Input, ComponentResolver, ViewContainerRef } from '@angular/core';
import { Child1Component } from '../children/child1.component'
import { Child2Component } from '../children/child2.component'
import { Child3Component } from '../children/child3.component'
import { ParentService } from './parent.service'
@Component({
selector: 'parent',
directives: [Child1Component, Child2Component, Child3Component],
providers: [ParentService],
template: `
<style>
.parent{
background-image: linear-gradient(141deg, #8ecb45 0%, #97cd76 71%, #96d885 100%);
width: 100%;
height: 200px;
}
</style>
<div class="parent"></div>
`
})
export class ParentComponent {
constructor(private parentService:ParentService, private children: any, viewContainer: ViewContainerRef, private componentResolver: ComponentResolver) {
this.children = parentService.getChildren();
for(var i = 0; i < children.length; i++) {
this.componentResolver.resolveComponent(children[i].component)
.then(componentFactory => {
const ctxInjector = viewContainer.injector;
return viewContainer.createComponent(componentFactory, 0, ctxInjector);
})
}
}
}
目前,在 ParentComponent 构造函数中调用服务似乎导致了一些问题。但是在我开始循环 componentResolver 之前,我能够在 parent 节点下方附加一个组件,但不在其中。
有谁知道构建动态 parent 组件的更好方法吗?这是为了管理布局的仪表板类型。大多数示例都明确说明将加载多少个组件。这对我不起作用。我看过一些关于如何使这项工作起作用的帖子,但到目前为止,我还没有看到任何关于 RC 和配置文件的内容。运行。
这最接近我正在尝试做的事情:http://plnkr.co/edit/jAmMZKz2VqponmFtPpes?p=preview
但它使用 dcl...
目前我在启动应用程序时收到一个我没有弄清楚的错误:TypeError: Cannot read 属性 'query' of null
感谢您的帮助!
这里有 link 如果您想下载并尝试一下:
https://github.com/weswhite/ng2-layout
EDIT/UPDATE:可能和我注射的children:any有关。我不认为我这样做是正确的,仍然在弄清楚这一点...
我很确定你在问题中提到的错误消息是由这个参数引起的
private children: any,
Angular 无法在没有提供具体类型且也没有 @Inject(...)
注释的情况下注入依赖项。
更新
包装器的完整示例 class 能够以声明方式添加动态组件
@Component({
selector: 'dcl-wrapper',
template: `<div #target></div>`
})
export class DclWrapper {
@ViewChild('target', {read: ViewContainerRef}) target;
@Input() type;
cmpRef:ComponentRef;
private isViewInitialized:boolean = false;
constructor(private resolver: ComponentResolver) {}
updateComponent() {
if(!this.isViewInitialized) {
return;
}
if(this.cmpRef) {
this.cmpRef.destroy();
}
this.resolver.resolveComponent(this.type).then((factory:ComponentFactory<any>) => {
this.cmpRef = this.target.createComponent(factory)
});
}
ngOnChanges() {
this.updateComponent();
}
ngAfterViewInit() {
this.isViewInitialized = true;
this.updateComponent();
}
ngOnDestroy() {
if(this.cmpRef) {
this.cmpRef.destroy();
}
}
}
来自
您可以使用带有子 ViewContainerRef 的 ComponentResolver 来动态创建组件并将它们加载到父组件中。
@Component({
selector: 'parent',
providers: [ParentService],
template: `
<style>
.parent{
background-image: linear-gradient(141deg, #8ecb45 0%, #97cd76 71%, #96d885 100%);
width: 100%;
height: 200px;
}
</style>
<div #content></div>
`
})
export class ParentComponent {
@ViewChild('content', { read: ViewContainerRef }) contentContainer: ViewContainerRef;
children: Component[];
constructor(
private parentService:ParentService,
private resolver: ComponentResolver) {
this.children = parentService.getChildren();
}
ngOnInit() {
this.children.forEach( (component, index) => this.loadComponent(component, index));
}
private loadComponent(component: Component, index: number) {
return this
.resolver
.resolveComponent(component)
.then( factory =>
this.contentContainer.createComponent(factory, index, this.contentContainer.injector))
}
}
我还升级了提供的 plunker 以使用最新的 @angular 和 ComponentResolver 而不是 DynamicComponentLoader:
笨蛋:http://plnkr.co/edit/Z6bXwBcwAnf4DSpNlU8H?p=preview
将 DCL 与 loadNextTolocation 一起使用:http://plnkr.co/edit/NYgJzz9UjrtGsNnO5WXS?p=info
P.S:您收到 TypeError:无法读取 属性 'query' of null,由于您注入 children
的方式,您必须指定可注入的输入.
另见
DynamicComponentLoader 已被弃用。我正在尝试构建一个 parent 组件,它根据 child 组件数组在 parent 组件内部呈现 child 组件,这意味着每个用户都有一个设置文件包含需要在 parent 中的 child 个组件。现在 parent 看起来像这样:
import { Component, OnInit, Input, ComponentResolver, ViewContainerRef } from '@angular/core';
import { Child1Component } from '../children/child1.component'
import { Child2Component } from '../children/child2.component'
import { Child3Component } from '../children/child3.component'
import { ParentService } from './parent.service'
@Component({
selector: 'parent',
directives: [Child1Component, Child2Component, Child3Component],
providers: [ParentService],
template: `
<style>
.parent{
background-image: linear-gradient(141deg, #8ecb45 0%, #97cd76 71%, #96d885 100%);
width: 100%;
height: 200px;
}
</style>
<div class="parent"></div>
`
})
export class ParentComponent {
constructor(private parentService:ParentService, private children: any, viewContainer: ViewContainerRef, private componentResolver: ComponentResolver) {
this.children = parentService.getChildren();
for(var i = 0; i < children.length; i++) {
this.componentResolver.resolveComponent(children[i].component)
.then(componentFactory => {
const ctxInjector = viewContainer.injector;
return viewContainer.createComponent(componentFactory, 0, ctxInjector);
})
}
}
}
目前,在 ParentComponent 构造函数中调用服务似乎导致了一些问题。但是在我开始循环 componentResolver 之前,我能够在 parent 节点下方附加一个组件,但不在其中。
有谁知道构建动态 parent 组件的更好方法吗?这是为了管理布局的仪表板类型。大多数示例都明确说明将加载多少个组件。这对我不起作用。我看过一些关于如何使这项工作起作用的帖子,但到目前为止,我还没有看到任何关于 RC 和配置文件的内容。运行。
这最接近我正在尝试做的事情:http://plnkr.co/edit/jAmMZKz2VqponmFtPpes?p=preview 但它使用 dcl...
目前我在启动应用程序时收到一个我没有弄清楚的错误:TypeError: Cannot read 属性 'query' of null
感谢您的帮助!
这里有 link 如果您想下载并尝试一下:
https://github.com/weswhite/ng2-layout
EDIT/UPDATE:可能和我注射的children:any有关。我不认为我这样做是正确的,仍然在弄清楚这一点...
我很确定你在问题中提到的错误消息是由这个参数引起的
private children: any,
Angular 无法在没有提供具体类型且也没有 @Inject(...)
注释的情况下注入依赖项。
更新
包装器的完整示例 class 能够以声明方式添加动态组件
@Component({
selector: 'dcl-wrapper',
template: `<div #target></div>`
})
export class DclWrapper {
@ViewChild('target', {read: ViewContainerRef}) target;
@Input() type;
cmpRef:ComponentRef;
private isViewInitialized:boolean = false;
constructor(private resolver: ComponentResolver) {}
updateComponent() {
if(!this.isViewInitialized) {
return;
}
if(this.cmpRef) {
this.cmpRef.destroy();
}
this.resolver.resolveComponent(this.type).then((factory:ComponentFactory<any>) => {
this.cmpRef = this.target.createComponent(factory)
});
}
ngOnChanges() {
this.updateComponent();
}
ngAfterViewInit() {
this.isViewInitialized = true;
this.updateComponent();
}
ngOnDestroy() {
if(this.cmpRef) {
this.cmpRef.destroy();
}
}
}
来自
您可以使用带有子 ViewContainerRef 的 ComponentResolver 来动态创建组件并将它们加载到父组件中。
@Component({
selector: 'parent',
providers: [ParentService],
template: `
<style>
.parent{
background-image: linear-gradient(141deg, #8ecb45 0%, #97cd76 71%, #96d885 100%);
width: 100%;
height: 200px;
}
</style>
<div #content></div>
`
})
export class ParentComponent {
@ViewChild('content', { read: ViewContainerRef }) contentContainer: ViewContainerRef;
children: Component[];
constructor(
private parentService:ParentService,
private resolver: ComponentResolver) {
this.children = parentService.getChildren();
}
ngOnInit() {
this.children.forEach( (component, index) => this.loadComponent(component, index));
}
private loadComponent(component: Component, index: number) {
return this
.resolver
.resolveComponent(component)
.then( factory =>
this.contentContainer.createComponent(factory, index, this.contentContainer.injector))
}
}
我还升级了提供的 plunker 以使用最新的 @angular 和 ComponentResolver 而不是 DynamicComponentLoader: 笨蛋:http://plnkr.co/edit/Z6bXwBcwAnf4DSpNlU8H?p=preview
将 DCL 与 loadNextTolocation 一起使用:http://plnkr.co/edit/NYgJzz9UjrtGsNnO5WXS?p=info
P.S:您收到 TypeError:无法读取 属性 'query' of null,由于您注入 children
的方式,您必须指定可注入的输入.
另见