2017-12-03 9 views
4

条件付きでメソッドの実行を妨げるメソッドデコレータを作成したい場合や、メソッドを他のプロシージャに置き換える場合があります。特に、私はそれは、クライアントまたはサーバー上で呼び出されたときに基づいて異なる動作をします:メソッド実行を条件付きで防ぐためのJS TSデコレータ

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

答えて

4

ES2016方法デコレータは、3つのパラメータ持つ機能です:

  • targetを - のいずれかクラスのプロトタイプ(装飾されるメソッドがインスタンスメソッド)またはクラスのコンストラクタ(装飾されるメソッドがスタティックの場合)。
  • name - 装飾されるメソッドの名前。
  • descriptor - descriptor objectが装飾されています。

デコレータは元の関数よりも多くの(または少ない)ことを行い、新たな機能の周りの既存のメソッドをラップすることにより、方法をを飾る(または増強)することができます。それは重要ではありません

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

:これを考慮して

serverMethodたちは、クライアントまたはサーバーにあるかどうかをチェックする新機能を中心に(私たちは飾るしたいメソッドを含む)descriptor.valueをラップする必要があります...argsを忘れると、メソッドに渡された引数はmethod.applyを介して装飾されたメソッドによっても使用されます。

さらに読書:

関連する問題