2014-09-18 79 views
1

我目前使用meteorjs 0.9.2我如何返回對象包含meteorjs中的函數?

我想從一個服務器的方法在服務器返回的對象

這裏返回一個對象,以客戶端的方法調用包含的功能價值,我認爲它可以做以下的

01給出

 return EJSON.stringify({ 

      plotOptions: { 
       series: { 
        stacking: 'normal', 
        point: { 
         events: { 
          click: function() { 
           alert('ok'); 
          } 
         } 
        } 
       } 
      }, 

     }); 

客戶方法接收meteorjs EJSON

服務器方法返回對象給予

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":{}}}}} 

給我如何傳遞一個對象包含功能的回報?

+1

你不能串聯一個函數 – Johan 2014-09-18 20:31:47

+0

johan - 那我該如何傳遞函數? EJSON有可能嗎? – 2014-09-18 20:33:29

+1

你不知道。傳遞其他價值,陳述您的興趣並重建客戶端。 – Prusse 2014-09-18 20:50:41

回答

-1

您可以在服務器上使用toString,在客戶端上使用eval

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

//client 
eval(str)(); 

只要確保您瞭解使用eval的implications

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); 
相關問題