2016-11-18 1 views
1

Ich suchte viel nach Decorator Erklärung mit Typoskript, aber ich finde keine vollständige Dokumentation, die ich auf meinen Zweck anwenden kann.Typescript Klasse Dekorator zu erweitert Methode

Ich fand zwei mögliche Lösung: AOP und Decorator, aber ich verstehe, dass AOP "noch nicht bereit" ist.

Die Idee ist - ich habe einige Sicherheitsbibliothek zu implementieren und ich muss eine Methode "EnterAction" und "leaveAction" aufrufen, wenn die aktuelle Seite ändern.

Ich habe eckige/ionische Livezyklus-Ereignisse für Seitenwechsel (laden/verlassen). Und ich möchte sie an einer Stelle "überschreiben", weil ich nicht jede Seite Komponente ändern möchte. (Wenn ich ein neues hinzufügen werde, werde ich vergessen, es zu implementieren).

Also Die Idee war, einen Dekorator auf jeder Seitenklasse hinzuzufügen. In diesem Decorator fügen Sie einen Aufruf an meine sichere Bibliothek (geben Sie/leaveAction) hinzu, wenn das Ereignis (load/leave) aufgerufen wird.

Eigentlich kann ich Dekorator auf Klasse erstellen. Aber ich weiß nicht, wie man den Methodenaufruf übersteuert.

Derzeit definiert ich meine Klasse Dekorateur liek dass:

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

Grüße,

EDIT

Finaly, fand ich eine andere Art und Weise ohne Dekorateur mit meinem Problem zu lösen.

Antwort

1

sind Sie ganz in der Nähe, man muss nur apply verwenden:

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

ich versucht, aber es sagen 'Fehler t ionViewWillEnter Fehler: Kann nicht Eigenschaft lesen‚anwenden‘von undefined' – manu

+0

Das ist eine Laufzeit Fehler, es bedeutet, dass die Klasse, die an den Dekorator übergeben wurde, nicht "method1" hatte. Als ich es ausgeführt habe, hat es funktioniert, also glaube ich, dass du Code ausführst, der anders ist als was du gepostet hast? –

+0

Endlich habe ich einen anderen Weg gefunden, die Methode zu abonnieren. Method1 ist abonnierbar. Und in meiner AppComponent (mit ionic) benutze ich 'this.nav._app.method1scripture (...' Aber danke für deine Hilfe. Ich werde mehr in der Tiefe Verzierungen später überprüfen. – manu

Verwandte Themen