获取模块类名和组件类名

ste*_*ers 1 angular angular5

我们想要测量以下 Angular 事件,并且我们知道如何做到这一点:

  • 组件和指令的 ngAfterViewInit (通过生命周期钩子)
  • 路由导航计时(通过路由器事件)
  • 通过common/http的http客户端进行http调用(通过拦截器)

但我们想记录额外的信息:

  • 与路由关联的模块类名称和路由组件类名称
  • 注册给定组件的模块类名称
  • 进行 http 调用的服务或组件以及关联的模块

我们怎样才能得到这些额外的信息呢?

Noé*_*aün 5

查找函数的调用者

您可以利用调用堆栈来查找进行调用的服务或组件。看到这个问题

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)
}
Run Code Online (Sandbox Code Playgroud)

请参阅此 StackBlitz了解工作示例

查找路径的组成部分

我没有时间深入研究这个主题,如果我有时间的话明天我会尝试一下

我认为您可以通过路由器事件获取所需的所有信息。它们可以访问已解析的路由,其中​​包含所有配置,包括应插入路由器出口的组件。