【问题标题】:get module class name and component class name获取模块类名和组件类名
【发布时间】:2018-08-17 02:03:48
【问题描述】:

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

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

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

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

我们如何获得这些额外信息?

【问题讨论】:

    标签: angular angular5


    【解决方案1】:

    找到函数的调用者

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

    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

    查找路由的组件

    我没有时间深入研究这个问题,如果有时间我明天试试

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-18
      • 1970-01-01
      • 2010-10-08
      • 2022-06-12
      • 1970-01-01
      • 2020-07-21
      • 1970-01-01
      • 2011-04-05
      相关资源
      最近更新 更多