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;
}