我想定义一个服务器端的Meteor方法,当被调用时,它将在客户端上运行一个函数。
下面的简单示例 - 我希望此方法获取参数,并且在调用时,将在客户端控制台上运行console.log(parameter)
。
Meteor.methods({
consoleLogOnClient: function(text){
var log = function(){
console.log(text);
};
return log();
}
});
但是当我这样做时:
Meteor.call('consoleLogOnClient', 'THIS MESSAGE SHOULD APPEAR ON THE CLIENT CONSOLE');
消息将记录在服务器控制台中,并且客户端控制台中不会显示任何内容。
好的,公平的。也许我只是返回功能代码本身并将其存储在变量中然后运行它。但它也不起作用。
Meteor.methods({
consoleLogOnClient: function(text){
var log = function(){
console.log(text);
};
return log;
}
});
var myFunction = Meteor.call('consoleLogOnClient', 'THIS MESSAGE SHOULD APPEAR ON THE CLIENT CONSOLE');
myFunction();
答案 0 :(得分:2)
http://docs.meteor.com/#meteor_methods
他们应该返回一个EJSON-able值或抛出异常。
EJSON:http://docs.meteor.com/#ejson
因此,答案是您无法从服务器向客户端发送函数,因为函数不是EJSON值。但你真正的问题可能是你要发送一个功能;我无法想象你为什么要那样做。改为发送数据。
答案 1 :(得分:1)
您可以使用anticoders:client-call包获得所需的结果。它允许您定义您能够从服务器端运行的客户端方法。
例如,如果您定义:
Meteor.ClientCall.methods({
'consoleLog': function(message) {
console.log(message);
},
});
为方法设置userId
为clientId
:
Deps.autorun(function() {
Meteor.ClientCall.setClientId(Meteor.userId());
});
然后在服务器端,您只需致电:
Meteor.ClientCall.apply(userId, 'consoleLog', ['THIS MESSAGE SHOULD APPEAR IN THE CLIENT CONSOLE']);