2017-12-03 8 views
4

Ich möchte einen Methoden-Decorator schreiben, der die Ausführung der Methode bedingt verhindert oder die Methode durch eine andere Prozedur ersetzt. Insbesondere möchte ich ein anderes Verhalten auf, wenn es auf dem Client oder auf dem Server aufgerufen wird:JS TS-Dekorator, um die Ausführung der Methode bedingt zu verhindern

function serverMethod(target) { 
    if(Meteor.isClient) { 
     // call server method to delete a user 
     // prevent execution of decorated method 
    } 
} 

class User { 
    @serverMethod 
    delete() { 
     UserCollection.delete(this.id) 
    } 
} 

Antwort

4

ES2016 Methode Dekorateure sind Funktionen, die drei Parameter:

  • target - entweder die Prototyp der Klasse (wenn die zu dekorierende Methode eine Instanzmethode ist) oder der Konstruktor der Klasse (wenn die zu dekorierende Methode statisch ist).
  • name - der Name der zu dekorierenden Methode.
  • descriptor - die descriptor object der zu dekorierenden Methode.

kann Dekorateur dekorieren (oder verbessern) ein Verfahren, durch das bestehende Verfahren um eine neue Funktion Verpackung, die mehr (oder weniger) Dinge als die ursprüngliche Funktion der Fall ist.

dies mit Hintergrund sollten serverMethod wickeln die descriptor.value (die die Methode enthält, die wir wollen dekorieren) um eine neue Funktion, ob wir in dem Client oder Server sind überprüft:

function serverMethod(target: any, name: string, descriptor: PropertyDescriptor) { 

    const method = descriptor.value; // references the method being decorated 

    descriptor.value = function(...args) { 

     if(Meteor.isClient) { 
      return; // exit the function 
     } 

     // This part will run when Meteor.isClient == false 
     method.apply(this, args); 
    }; 
} 

class User { 
    @serverMethod 
    delete() { 
     UserCollection.delete(this.id) 
    } 
} 

Es ist nicht wichtig um die ...args zu vergessen, damit die an Ihre Methoden übergebenen Argumente auch von der dekorierten Methode über method.apply verwendet werden.

Weiterführende Literatur:

Verwandte Themen