首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用装饰器的角>= 2.x修正分量法

使用装饰器的角>= 2.x修正分量法
EN

Stack Overflow用户
提问于 2017-07-12 22:10:44
回答 1查看 349关注 0票数 1

它的目标是一种非侵入性的技术来跟踪用户在期望的组件行为上的动作.滴答声之类的。

我喜欢装饰者如何改变行为,但我不确定这是不可能的,还是我做错了。

如果这样做有效的话,它的行为基本上就像对原始事件处理程序的包装。我可以简单地通过处理程序上的装饰来跟踪和取消跟踪事件。但我的目标是不要用这个用户跟踪层“弄脏”处理程序逻辑。同样方便的是,在某些组件上下文中调用装饰器,并且不需要显式地编码上下文。该上下文信息在日志记录中可能很有用。

app.component.ts

代码语言:javascript
复制
import { Component } from '@angular/core';
import { CaptureUserEvent } from 'app/user-action-tracker';

@Component({
    template: `
<h1>
  {{title}}
</h1>
<a href="#" (click)="setTitleText($event)">Test</a>
`,
    selector: 'app-root',
    styleUrls: ['./app.component.css'],
})
export class AppComponent {
    title = 'app works!';

    getElementText(elt:HTMLElement) {
        return elt.innerText;
    }

    @CaptureUserEvent
    setTitleText(ev:Event):void {
        console.log('called setTitleText');
        let newText = this.getElementText(<HTMLElement>ev.target);
        this.title = newText;
    }
}

user-action-tracker.ts

代码语言:javascript
复制
function CaptureUserEvent(cls, methodName, propertyDefinition):any {
    var oldMethod = cls[methodName];

    // this ultimately doesn't work... the AppComponent class retains the original function when it runs
    cls[methodName] = function (ev:Event) {
        console.log('called wrapper');

        // log event...

        oldMethod(ev);
    };
}

export {
    CaptureUserEvent
}

是否有正确的方法来做到这一点,或类似的事情,以实现同样的目标?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-13 01:05:23

如果您修改描述符的值,它就会工作:

代码语言:javascript
复制
function CaptureUserEvent(cls, methodName, descriptor): void {
  let oldMethod = descriptor.value;

  descriptor.value = (ev: Event) => {
    console.log('called wrapper');

    oldMethod.call(cls, ev);
  };
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45068316

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档