angularjs - decorator de clasă TypeScript pentru a extinde metoda
Am căutat mult o explicație despre decorator cu TypeScript, dar nu am găsit o documentație completă pe care să o pot aplica pentru scopul meu.
Am găsit două soluții posibile: AOP și Decorator, dar înțeleg că AOP nu este „încă pregătit”.
Ideea este -- am o bibliotecă de securitate de implementat și trebuie să apelez unele metode „enterAction” și „leaveAction” atunci când pagina curentă se schimbă.
Am evenimente Angular/Ionic lifecycle pentru schimbarea paginii (load/leave). Și aș dori să le „suprascriu” într-un singur loc pentru că nu vreau să modific fiecare componentă de pagină. (Când voi adăuga una nouă, voi uita să o implementez).
Așadar, ideea era să adaug un decorator la fiecare clasă de pagină. În acest decorator să adaug apelul la biblioteca mea de securitate (enter/leaveAction) atunci când se apelează evenimentul (load/leave).
De fapt, pot crea un decorator pentru clasă. Dar nu știu cum să suprascriu apelul metodei.
În prezent mi-am definit decoratorul de clasă astfel:
@security
@Component({
selector: 'my-app',
template: '<h1>Hello Angular!</h1>'
})
export class AppComponent implements OnInit {
private toto= "demo";
constructor() {
console.log("construct!");
}
ngOnInit() {
console.log('onInit');
this.method1();
}
method1() {
console.log('method 1 : '+ this.toto);
}
}
function security<TFunction extends Function>(target: TFunction): TFunction {
var method1 = target.prototype.method1;
Object.defineProperty(target.prototype, 'method1', {
value: function() {
console.log('enterAction here');
// How to call real method1() here ?
// Call of method1() will fail since it don't know AppCompnent.toto here
return '';
}
});
return target;
}
Cu stimă,
EDITEAZĂ
În cele din urmă, am găsit o altă cale fără a folosi decorator pentru a-mi rezolva problema.
Răspuns #1
Ești foarte aproape, trebuie doar să folosești apply:
function security<TFunction extends Function>(target: TFunction): TFunction {
var method1 = target.prototype.method1;
Object.defineProperty(target.prototype, 'method1', {
value: function() {
console.log('enterAction here');
return method1.apply(this, arguments);
}
});
return target;
}
