Khe*_*hin 10 components dynamic typescript angular
嗨,我是angular2和打字稿的新手.我正在动态加载组件,我想知道是否有办法在模块的"声明"和"entryComponents"中使用服务声明我的组件.
使用typescript,我可以通过执行以下操作来实现它:
import { ComponentLoaderService } from './../../services/component-loader.service';
let componentsToLoad = ComponentLoaderService.getComponents();
@NgModule({
declarations: [ componentsToLoad ],
entryComponents: [ componentsToLoad ],
})
export class testModule {}Run Code Online (Sandbox Code Playgroud)
这实际上有效,但只有在我编译并且服务器首先运行时.
如果,我尝试重新编译并运行它,我得到这个常量错误:
"静态解析符号值时遇到错误.不支持函数调用.请考虑使用对导出函数的引用替换函数或lambda,"
我的另一个想法是,有没有办法将组件加载到"export class testModule {}"部分来填充数组然后将其传递给NgModule?
从我目前的测试来看它不起作用,但我还是新手,所以我可能会遗漏一些东西.
希望有人能提供帮助.谢谢!
以下是创建编译错误的代码:
我刚刚做了一个新的测试应用程序.
然后在test-app文件夹中我做了npm install.
我创建了/src/app/services/components-loader.service.ts.
import { Injectable } from '@angular/core';
import { ViewContainerRef, ViewChild, ComponentFactoryResolver } from '@angular/core';
@Injectable()
export class ComponentLoaderService {
constructor(private componentFactoryResolver: ComponentFactoryResolver){}
static getComponents(components: any[]): any[] {
var tmp = Array();
for (var i = 0; i < components.length; ++i){
if (components[i].key == 0){
tmp.push(components[i].component);
}
}
return tmp;
}
load(container: ViewContainerRef, components: any[]): void {
// clear
container.clear();
for (var i = 0; i < components.length; ++i){
if (components[i].key == 0 || components[i].key == 'site'){
const childComponent = this.componentFactoryResolver.resolveComponentFactory( components[i].component );
// at this point we want the "child" component to be rendered into the app.component:
container.createComponent(childComponent);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我创建了一个文件/src/app/components.ts.
import { TestComponent } from './test.component';
export const mainComponents = [
{ key: 0, component: TestComponent },
];
Run Code Online (Sandbox Code Playgroud)
我创建了一个文件/src/app/test.component.ts.
import { Component } from '@angular/core';
@Component({
template: `test`,
})
export class TestComponent {}
Run Code Online (Sandbox Code Playgroud)
我修改了/src/app/app.module.ts看起来像这样.
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { HttpModule } from '@angular/http';
import { AppComponent } from './app.component';
import { mainComponents } from './components';
import { ComponentLoaderService } from './services/components-loader.service';
let componentsToLoad = ComponentLoaderService.getComponents(mainComponents);
@NgModule({
declarations: [
AppComponent,
componentsToLoad
],
imports: [
BrowserModule,
FormsModule,
HttpModule
],
providers: [],
bootstrap: [AppComponent],
entryComponents: [ componentsToLoad ],
})
export class AppModule { }
Run Code Online (Sandbox Code Playgroud)
当我使用ng serve编译时,我收到此错误:
10%构建模块2/2模块0 activeError:在静态解析符号值时遇到错误.不支持函数调用.考虑使用对导出函数的引用替换函数或lambda,解决D:/ angularjs/test-app/src/app/app.module.ts中的符号AppModule,解决D:/ angularjs/test-app /中的符号AppModule SRC /应用程序/ app.module.ts
@NgModule({
declarations: [],
exports: []
})
export class testModule {
static withComponents(components: any[]) {
return {
ngModule: testModule,
providers: [
{provide: ANALYZE_FOR_ENTRY_COMPONENTS, useValue: components, multi: true}
]
}
}
}
Run Code Online (Sandbox Code Playgroud)
其他模块:
import { ComponentLoaderService } from './../../services/component-loader.service';
let componentsToLoad = ComponentLoaderService.getComponents();
@NgModule({
imports: [
BrowserModule,
FormsModule,
testModule.withComponents([
...componentsToLoad
])
],
declarations: [
AppComponent,
...componentsToLoad
],
bootstrap: [AppComponent]
})
export class AppModule {
}
Run Code Online (Sandbox Code Playgroud)
通过在此处使用ANALYZE_FOR_ENTRY_COMPONENTS,您可以动态地将多个组件添加到NgModule.entryComponents条目.
| 归档时间: |
|
| 查看次数: |
8056 次 |
| 最近记录: |