【问题标题】:JS TS decorator to conditionally prevent method executionJS TS 装饰器有条件地阻止方法执行
【发布时间】:2018-05-17 04:14:53
【问题描述】:

我想编写一个方法装饰器,有条件地阻止执行该方法或用其他过程替换该方法。特别是我希望根据何时在客户端或服务器上调用不同的行为:

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

【问题讨论】:

    标签: javascript typescript decorator


    【解决方案1】:

    1。概念概述

    ES2016 方法装饰器是具有 3 个参数的函数

    • target — 类的原型(如果被修饰的方法是实例方法)或类的构造函数(如果被修饰的方法是static) .
    • name — 被装饰的方法的名称。
    • descriptor — 被修饰的方法的 [descriptor object][1]

    装饰器可以装饰(或增强)一个方法,方法是将现有方法包装在一个新函数周围,该新函数比原来的函数做更多(或更少)的事情。

    2。修复/改进问题代码

    考虑到这一点,serverMethod 应该将descriptor.value(其中包含我们要装饰的方法)包装在一个新函数周围,以检查我们是在客户端还是服务器中:

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

    重要的是不要忘记...args,以便通过method.apply 传递给您的方法的参数也将被装饰方法使用。

    3。进一步阅读

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-17
      • 1970-01-01
      • 1970-01-01
      • 2019-11-02
      • 2011-04-15
      • 2015-10-23
      • 2023-01-04
      • 2022-11-28
      相关资源
      最近更新 更多