我如何在meteorjs中返回对象包含函数?

时间:2014-09-18 20:29:55

标签: javascript json object meteor

我目前正在使用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":{}}}}}

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

2 个答案:

答案 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