angular - 如何从指令中获取 Angular View 层次结构?

标签 angular typescript

Angular 版本 6+

我正在研究一个指令,该指令可以放置在任何元素上以用于一般使用日志记录。对于上下文,它看起来类似于以下内容:

@Directive({
  selector: '[log]'
})
export class LogDirective {
  @Input() log: string; // the log message
  @Input() logOn: string; // event name to trigger logging

  constructor(private renderer: Renderer2,
              private elementRef: ElementRef) {
  }

  ngOnInit() {
    this.renderer.listen(this.elementRef.nativeElement, this.logOn, () => {
      // log the message, etc.
    }
  }
}

<div log="Clicked the element" logOn="click">Click Me</div>

这工作正常,但我认为自动获取某种类型的父层次结构以便可以记录会很酷。这样,有人可以查看日志并很容易地看到这是从哪里记录的。类似于“AppComponent -> SomeOtherComponent -> ParentCompnent”。是否可以向该指令注入(inject)一些东西来确定它在 View 层次结构中的位置?

最佳答案

您可以将 ViewContainerRef 注入(inject)指令以访问托管组件。 然后您可以使用它来读取当前组件和该组件的父组件。

递归地这样做会得到你想要的结果。

像这样(我会把递归算法留给你):

constructor(private viewContainerRef: ViewContainerRef) { }

private clicked() {
    console.log(this.viewContainerRef['_view'].component);
    console.log(this.viewContainerRef['_view'].parent.component);
    console.log(this.viewContainerRef['_view'].parent.parent.component);
  }

(1) Stackblitz demo

(1)忽略应用程序的其余部分,我在谷歌上搜索了某人的“Angular Directive(指令)模板”并对其进行了更改以快速获取此模板

(2)当然,免责声明,“你不应该阅读 Angular 上的 _attributes,因为它可以在未来的版本中更改而不通知,你将不支持那些"等等等等。

关于angular - 如何从指令中获取 Angular View 层次结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53070272/

相关文章:

Angular/RxJS 多播 Observable 的 Observable

node.js - 使用 NodeJS 实例化一个 Admin SDK 目录服务对象

javascript - 在使用 typescript 的 Jasmine 测试中注入(inject) $http 失败

angular - 如何在另一个表单构建器上的对象上设置值 - Typescript

typescript - 使用泛型和 keyof 时推断回调参数的属性类型

javascript - 有什么理由不使用提前编译?

node.js - 部署在 Heroku 上的 Angular 应用程序上的代理路由

typescript - 如何通过 angular2 中的渲染器(或替代)获取类属性

javascript - 自定义加载器不适用于 react-table

Typescript:映射类型,使除所选属性之外的每个属性均为只读