我想编写一个方法装饰器,它有条件地阻止执行该方法或用其他一些过程替换该方法。特别是我想根据在客户端或服务器上调用它的时间而采用不同的行为:
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)
}
}
答案 0 :(得分:6)
ES2016方法装饰器函数有3个参数:
target
- 类的原型(如果正在装饰的方法是实例方法)或类的构造函数(如果要装饰的方法是静态强>)。name
- 正在装饰的方法的名称。 descriptor
- 正在装饰的方法的 descriptor object 。 装饰者可以通过将现有方法包装在比原始函数更多(或更少)的新函数中来装饰(或增强)方法。
考虑到这一点,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
使用。
进一步阅读: