是否有可能以某种方式覆盖Meteor中的方法? 或者定义另一个函数,以便两个都会被调用?
在我的常规代码中:
Meteor.methods(
foo: (parameters) ->
bar(parameters)
)
以后加载的其他地方(例如在tests
中):
Meteor.methods(
# override
foo: (parameters) ->
differentBehavior(parameters)
# I could call some super() here
)
所以我希望要么bar
和differentBehavior
都执行,要么只有differentBehavior
,并且有可能调用super()
。
这是否存在?
答案 0 :(得分:4)
要覆盖方法,可以在服务器端执行以下操作:
Meteor.methods({
'method_name': function () {
//old method definition
}
});
Meteor.default_server.method_handlers['method_name'] = function (args) {
//put your new code here
};
方法定义后必须包含Meteor.default_server.method_handlers['method_name']
。
要覆盖方法(也称为存根),在客户端可以执行以下操作:
Meteor.connection._methodHandlers['method_name'] = function (args) {
//put your new code here
};
方法定义后必须包含Meteor.connection._methodHandlers['method_name']
。
答案 1 :(得分:2)
有很多方法可以做你想做的事。
例如,覆盖任何函数的最简单方法是执行以下操作:
Meteor.publish = function() { /* My custom function code */ };
我们用我们自己的实例覆盖了Meteor.publish。
但是,如果你想包装像代理一样的函数(我相信这被称为“代理模式”:
var oldPublish = Meteor.publish();
Meteor.publish = function() {
oldPublish(arguments); // Call old JS with arguments passed in
}
ES6还添加了一个Proxy
对象,允许您执行类似的操作(阅读here)。
此外,还有很多AOP个库(CujoJS,jQuery-AOP和node-aop等等)可以让您在之前,之后,周围进行JavaScript函数/对象上的切入点。如果你也愿意,你甚至可以自己动手。