Angular 获取当前应用程序中的所有组件实例
我正在寻找一种方法来获取当前显示给用户的所有组件实例,如果可能,还可以获取所有服务实例 我考虑过使用ApplicationRef,但它只提供appComponent引用 我还尝试了注入器,但是您必须显式地给出类来获取组件实例 最后,我也尝试了路由器,但没有成功 有没有办法获取角度应用程序中的所有组件实例 我还应该声明我的组件都是路由的,并且大多数都是延迟加载的 编辑:用例 我正在尝试实现一个类似于Angular lifecycle挂钩的事件管理器。这意味着我可以这样写我的组件Angular 获取当前应用程序中的所有组件实例,angular,typescript,Angular,Typescript,我正在寻找一种方法来获取当前显示给用户的所有组件实例,如果可能,还可以获取所有服务实例 我考虑过使用ApplicationRef,但它只提供appComponent引用 我还尝试了注入器,但是您必须显式地给出类来获取组件实例 最后,我也尝试了路由器,但没有成功 有没有办法获取角度应用程序中的所有组件实例 我还应该声明我的组件都是路由的,并且大多数都是延迟加载的 编辑:用例 我正在尝试实现一个类似于Angular lifecycle挂钩的事件管理器。这意味着我可以这样写我的组件 export cl
export class MyComponent implements EventManager {
onCustomEvent(event) {...}
}
你是说像这样的事吗
import { ....ComponentFactoryResolver } from '@angular/core';
export class Test{
constructor(
private resolver: ComponentFactoryResolver
) {
const factories = Array.from(this.resolver['_factories'].keys());
console.log(factories);
}
}
我不知道angular本身是否有什么东西可以帮助你解决这个问题。但是,您可以通过创建一个名为SampleService的服务来存储对已创建组件的引用来解决这个问题 详情如下: 在您的component.ts中
export class MyComponent implements OnInit , OnDestroy{
constructor(private readonly sampleService:SampleService) {}
ngOnInit(){
this.sampleService.addRef(this);
}
ngOnDestroy(){
this.sampleService.removeRef(this);
}
}
好吧,我终于找到了一种方法:装饰师 这是装饰师:
export function MsEvents(): ClassDecorator {
const eventManager = AppModule.injector.get(EventManagerService);
return function (instance) {
eventManager.onCustomEvent().subscribe(arg => instance.prototype['onCustomEvent'](arg));
};
}
有了这个decorator,我可以在本例的onCustomEvent中将定义的函数调用到我的组件中。所需要的只是
这位装饰师
组件将实现的接口
app模块中喷油器的静态参考:
export class AppModule {
static injector: Injector;
constructor(injector: Injector) {
AppModule.injector = injector;
}
}
这个用例是什么?@AmitChigadani我正在实现一个事件管理器,它的工作方式类似于生命周期挂钩。查看我的编辑。@trichetriche您尝试过使用ComponentRef吗?@VaibhavKumarGoyal来自哪里?我确实希望使用组件引用,但ComponentRef不是您可以在服务中注入以获取所有组件引用的东西……它确实在工作,但它不会返回所有组件—有些组件甚至还不存在,但它会返回它们。有没有办法获取所有组件,或者只创建组件?我有大约100个组件,如果我想存储所有组件,这意味着我必须写100次相同的东西。。。我先考虑过这个解决方案,但是成本太高了,每次创建新组件时都要写这个,这不实用。我对装饰师不太熟悉。但我认为它可以帮助你避免多次重复代码。我确实在研究decorator解决方案:我将装饰函数,以便在提交事件时运行它们。但现在这是一条死胡同,就像其他解决方案一样。这就是为什么我在那里要求一个解决方案。