如何在metrojs中返回object contain函数

how i return object contain function in meteorjs?

本文关键字:object contain 函数 返回 metrojs      更新时间:2023-09-26

i当前使用metrojs 0.9.2

我想将对象从服务器方法返回到客户端方法调用

在该服务器返回对象中包含一个函数作为值,我认为可以使用metrojs 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":{}}}}}

如何将包含对象的函数作为返回传递?

解决此类问题的正确方法是在客户端定义所有感兴趣的函数,然后根据您传递的EJSONable值选择合适的函数。如果这是应用程序中的常见模式,您可以创建一个可能操作的字典:

Actions = {};
Actions.alertOk = function() {
  alert('ok');
};
Actions.confirm = function(message) {
  if(confirm(message)) alert('ok');
};
...

然后在您的返回语句中传递操作名称:

return {
  ...
  action: {
    name: 'confirm',
    arguments: [
      'Do you want an OK alert?',
    ],
  }
};

然后在需要时调用请求的操作:

Actions[action.name].apply(this, action.arguments);

您可以在服务器上使用toString,在客户端上使用eval。

//server
var str = (function click() {
  alert('ok');
}).toString();
//client
eval(str)();

只要确保您理解使用eval的含义即可。