我不确定这是更好更优雅的解决方案,因为我是 Angular 的新手,但它目前对我有用。
我假设一个插件是一个元素 Web 组件(https://angular.io/guide/elements)。为了创建我的第一个元素(插件),我遵循了本教程:https ://www.techiediaries.com/angular/angular-9-elements-web-components/ 。
顺便说一句,此时我无法动态加载我的插件,因为在编译项目以使用它之前,我必须知道我在元素中部署的组件的名称。我使用Extensions Element ( https://angular-extensions.github.io/elements/#/home ) 找到了解决方案。所以我创建了一个动态组件,用于在运行时显示插件的组件。
这是动态组件的代码:
export class DynamicComponentContainerComponent implements OnInit {
plugin: Plugin
sub: any;
constructor(private route: ActivatedRoute, private pluginService: PluginService) { }
ngOnInit() {
this.sub = this.route
.data
.subscribe(data => {
this.pluginService.getPlugin(data['pluginName'])
.subscribe(
(res) => {
this.plugin = res;
},
(err) => {
console.error(err)
}
);
});
}
ngOnDestroy() {
this.sub.unsubscribe();
}
}
以及它的 html 模板:
<div *ngIf="plugin != null">
<ng-template #loading>Loading plugin {{plugin.tag}} ...</ng-template>
<ng-template #error>Error Loading plugin {{plugin.tag}}</ng-template>
<ax-lazy-element
*axLazyElementDynamic="plugin.tag; url: plugin.url; module: plugin.isModule;
errorTemplate: error; loadingTemplate: loading;">
</ax-lazy-element>
</div>
它可以工作,因为我的后端服务于插件的 JS 编译文件(元素 Web 组件),所以我必须在使用它之前注册我的插件(因为我需要一些值来处理它,比如组件的名称或路由的路径)。实际上,动态组件中的axLazyElementDynamic属性需要 JS Element Web 组件文件的 url 和组件名称才能起作用。
现在我必须动态地为每个插件组件添加路由路径。在我的应用程序组件中,我创建了这个简单的方法:
loadPlugins() {
this.pluginService.getPlugins()
.subscribe(plugins => {
plugins.forEach(plugin => {
this.router.config.unshift({ path: plugin.path, component:
DynamicComponentContainerComponent, data: { pluginName: plugin.name } });
this.links.push({ text: plugin.description, path: plugin.path });
});
});
}
插件服务只是从后端(我之前注册插件的地方)获取插件数据。
我希望这可以帮助某人。