它的目标是一种非侵入性的技术来跟踪用户在期望的组件行为上的动作.滴答声之类的。
我喜欢装饰者如何改变行为,但我不确定这是不可能的,还是我做错了。
如果这样做有效的话,它的行为基本上就像对原始事件处理程序的包装。我可以简单地通过处理程序上的装饰来跟踪和取消跟踪事件。但我的目标是不要用这个用户跟踪层“弄脏”处理程序逻辑。同样方便的是,在某些组件上下文中调用装饰器,并且不需要显式地编码上下文。该上下文信息在日志记录中可能很有用。
app.component.ts
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
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
}是否有正确的方法来做到这一点,或类似的事情,以实现同样的目标?
发布于 2017-07-13 01:05:23
如果您修改描述符的值,它就会工作:
function CaptureUserEvent(cls, methodName, descriptor): void {
let oldMethod = descriptor.value;
descriptor.value = (ev: Event) => {
console.log('called wrapper');
oldMethod.call(cls, ev);
};
}https://stackoverflow.com/questions/45068316
复制相似问题