2013-07-29 23 views
1

我已經使用jquery小部件工廠編寫了一些小部件。通常,我使用JavaScript代碼塊中的構件函數傳遞選項和回調引用。將函數對象引用作爲序列化的json傳遞

現在我想在自動生成的html頁面中使用小部件,並將選項傳遞給它們而不使用JavaScript塊。我正在指定嵌入式json中的一個常用JavaScript代碼塊解析的選項,並將它傳遞給該小部件。

<div id="search_widget"> 
    <script type="application/json"> 
    { 
     "search": { 
      "search_string": "text to be searched", 
      "callback": "a function object in an outer scope" 
     } 
    } 
    </script> 
</div> 

如何將保留其範圍的函數對象傳遞給json格式的小部件? 小部件將調用條件滿足時指定的函數。

感謝您的幫助。

+0

Function.prototype.toJSON = ... – dandavis

回答

0

您可以將函數體作爲文本傳遞,但您的接收上下文將必須知道它是一個函數,並用構造函數(或其他)構造函數「重新構造」它。你不能保留「範圍」,儘管這在JSON塊中並不意味着太多。

你也可以傳遞函數名稱,或者一些識別模式,或者其他任何你喜歡的東西,但是所有的條件是接收代碼知道如何處理它。

JSON沒有提供表示「功能」的機制。這個概念與格式完全不相容,正確的是,它的意圖是語言中立。

編輯 —需要注意的是,如果你的名字編碼的功能:

<script type="application/json"> 
{ 
    "search": { 
     "search_string": "text to be searched", 
     "callback": "search_callback_23" 
    } 
} 
</script> 

然後,抓住對象並解釋內容可以隨時與外JSON對象上下文調用函數的代碼:

function handleJSON(the_JSON_from_the_example) { 
    var json = JSON.parse(the_JSON_from_the_example); 
    if ("search" in json) { 
    var searchTerm = json.search.search_string; 
    var callback = findCallbackFunction(json.search.callback); // whatever 
    callback.call(json, searchTerm); // or json.search maybe? 
    } 
} 

換句話說,如果是這樣的解釋JSON編碼信息的代碼知道夠找到回調函數的引用,那麼就可以大概判斷出的Appro公司作爲this調用該函數時使用的priate對象。

+0

謝謝Pointy,但傳遞函數體不是一個選項。是否可以傳遞一個函數名稱和範圍指示,以便我可以代理方法調用? – Mountain

+0

@ user2631483只要接收環境有一種方法可以理解你的JSON如何識別函數,那麼你可以做任何事情(只要表示只涉及字符串和數字以及布爾值)。你必須解釋更多關於「範圍」的含義,因爲JSON中確實沒有這樣的東西。 – Pointy

+0

根據範圍,我的意思是以某種方式使用json傳遞'this'對象。但正如你所說的,JSON中不會有這樣的事情。 – Mountain