如何通过自定义装饰器记录@Input@Output值的值。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何通过自定义装饰器记录@Input@Output值的值。相关的知识,希望对你有一定的参考价值。

我试图通过简单地提供使用一个自定义的装饰器来记录我的组件的每一个输入(输入)和输出(输出)的值。我只是没有达到我可能读出一些值的地步。

自定义装饰器

function Log() {
  return (target: Object, propertyKey: string, descriptor: PropertyDescriptor) {
    console.log('this: ', this) // this: undefined
    console.log('target: ', target) // target: Object { constructor: f FooComponent() }
    console.log('propertyKey: ', propertyKey) // propertyKey: source
    console.log('descriptor: ', descriptor) // descriptor: undefined
    return descriptor;
  }
}

组成部分

export class FooComponent  {
  // This observable just emits 'one', 'two' and 'three' one by one.
  public source$ = of(['one', 'two', 'three']).pipe(
    mergeMap(identity)
  )

  // Wanted usage (if possible)
  @Output() @Log() source = this.source$;
}

控制台中的预期输出

one
two
three

@Output() 装饰器仍然可以工作,我得到了从 FooComponent. 但我不知道如何读出通过这个装饰器的变量,甚至从它那里读取值。我已经尝试了下面的正文 Log:

  • this[propertyKey] (在此我收到一个错误,因为无法读取未定义的属性)
  • target[propertyKey] (在这里我只是收到未定义的)

以防你需要一个测试设置。stackblitz

答案

感谢@FanCheung,他的文章参考给了我正确的知识来构建装饰器。

日志装饰器

function Log(): any {
  return (target: any, propertyKey: string | symbol) => {
    const key = Symbol();
    return {
      get() {
        return this[key]; 
      },
      set(newValue: Observable<any>) {
        console.log(newValue);
        this[key] = newValue.pipe(
          tap(v => console.error(`${String(propertyKey)}: `, v))
        );
      }
    }
  }
}

使用方法

// Class with decorator usage
class Foo {
  private readonly source$ = of('baz');
  @Output() @Log() source = this.source$
}

// Usage of Foo as <foo>
<foo (source)="..."></foo>

// Expected output
source: baz

解释

关于实际发生的事情,可以在文章中找到深刻的见解。装修公司的工作并不像你想象的那样.

以上是关于如何通过自定义装饰器记录@Input@Output值的值。的主要内容,如果未能解决你的问题,请参考以下文章

如何通过自定义装饰器提供非夹具 pytest 参数?

vs 代码更漂亮 - 在 @Input() 装饰器之后添加新行

如何将自定义装饰器添加到 FastAPI 路由?

通过描述符和类装饰器,自定义staicmethod(静态方法)

使用自定义 TS 装饰器的组件方法中未定义角服务

如何在 WPF 自定义装饰器中用线条排列拇指