【发布时间】:2018-08-17 02:03:48
【问题描述】:
我们想要测量以下 Angular 事件并且我们知道如何做到这一点:
- 组件和指令的ngAfterViewInit(通过生命周期挂钩)
- 路由导航计时(通过路由器事件)
- 通过common/http的http客户端调用http(通过拦截器)
但我们想记录额外的信息:
- 与路由关联的模块类名和路由组件类名
- 注册给定组件的模块类名
- 执行 http 调用和相关模块的服务或组件
我们如何获得这些额外信息?
【问题讨论】:
我们想要测量以下 Angular 事件并且我们知道如何做到这一点:
但我们想记录额外的信息:
我们如何获得这些额外信息?
【问题讨论】:
您可以利用调用堆栈来查找进行调用的服务或组件。看到这个问题
How do you find out the caller function in JavaScript?
要获取给定组件的声明模块,可以使用ComponentFactoryResolver。
解析组件时,它返回ComponentFactory。但是在查看源代码时,我们可以看到ComponentFactory 是一个抽象类。事实上,真正的类是ComponentFactoryBoundToModule,它知道它的模块。
它是有意识的,但它是私有的。如果只是用于调试或日志记录,我认为您可以忽略 TypeScript 并获取此私有属性。在运行时,隐私丢失了,所以你可以做类似的事情
constructor(private resolver: ComponentFactoryResolver) {
const factory = resolver.resolveComponentFactory(HelloComponent);
console.log('the factory:', factory);
// Access the private ngModule property.
const ngModuleRef: NgModuleRef<any> = (factory as any).ngModule;
console.log('the module name:', ngModuleRef.instance.constructor.name)
}
有关工作示例,请参阅 this StackBlitz
我没有时间深入研究这个问题,如果有时间我明天试试
我认为您可以通过路由器事件获得所需的所有信息。它们可以访问已解析的路由,其中包含所有配置,包括应插入路由器出口的组件。
【讨论】: