我目前正在使用meteorjs 0.9.2
我想将一个对象从服务器方法返回到客户端方法调用
这里服务器返回对象包含一个函数作为值,我认为它可能与meteorjs EJSON有关
下面给出的服务器方法返回对象
return EJSON.stringify({
plotOptions: {
series: {
stacking: 'normal',
point: {
events: {
click: function() {
alert('ok');
}
}
}
}
},
});
下面给出的客户端方法
Meteor.call("highcharts", Session.get("method"), Session.get("taskId"), function(error, object) {
$("#highcharts #loading").hide();
if(error) throwError(error.reason);
else $("#highcharts").highcharts(JSON.parse(object));
console.log(EJSON.parse(object));
});
但是在浏览器控制台日志中我无法将该对象元素值作为函数获取,它会显示下面给出的对象
{"plotOptions":{"series":{"stacking":"normal","point":{"events":{}}}}}
我如何传递一个包含函数的对象作为返回?
答案 0 :(得分:2)
解决此类问题的正确方法是在客户端定义所有感兴趣的函数,然后根据传递的EJSONable值选择适当的函数。如果这是您应用中的常见模式,则可以创建可能操作的字典:
Actions = {};
Actions.alertOk = function() {
alert('ok');
};
Actions.confirm = function(message) {
if(confirm(message)) alert('ok');
};
...
然后在你的return语句中传递动作名称:
return {
...
action: {
name: 'confirm',
arguments: [
'Do you want an OK alert?',
],
}
};
然后在需要时调用请求的操作:
Actions[action.name].apply(this, action.arguments);
答案 1 :(得分:-1)
您可以在服务器上使用toString,在客户端上使用eval。
//server
var str = (function click() {
alert('ok');
}).toString();
//client
eval(str)();
请确保您了解使用eval的implications。