2015-05-15 21 views
-2

我嘗試從我的服務器創建一個JSON並在客戶端角度檢索JSON。但我的JSON是一個函數。JSON問題來存儲一個函數並刪除引號

我在服務器上創建這個JSON:

var header = {}; 

var editor = 'function (container, options) {jsdd.appendTo(container); $compile(editor)($scope); editor.css("visibility", "visible")};'; 

header['editor'] = editor; 

在客戶端我找回我的JSON是這樣的:

editor: "function (container, options) {jsdd.appendTo(container); $compile(editor)($scope); editor.css("visibility", "visible")};" 

但是它不工作,因爲我想去掉引號並得到這個:

editor: function (container, options) {jsdd.appendTo(container); $compile(editor)($scope); editor.css("visibility", "visible")}; 

我該怎麼做?


更新

結果我嘗試從服務器發送的JSON獲得的是:

{ 
    title: "category", 
    field: "category", 
    editor: function (container, options) { 
    var editor = $('<input kendo-drop-down-list required k-data-text-field="\'valueen\'" k-data-value-field="\'id\'" k-data-source=\"mapDSource.get(\'category\')\" data-bind="value:' + options.field + '"/>') 
    .appendTo(container); 

    $compile(editor)($scope); 
    editor.css("visibility", "visible"); 
    } 

    , template: "{{getName(dataItem, 'category', 'id', 'valueen')}}" 
    , type: 'string', 
    editable: true, 
    width: 250 
    }, 
    { 
    title: 'keyen', 

    type: 'string', 
    field: 'keyen', 
    editable: true, 
    validation: { 
    required: true 

    }, .... 

所有作品除外編輯器參數是一個函數,所以我我在做以下工作:

var table = {}; 

    table.type = "referential"; 

    gridService.loadTable(table).success(function (data) { 

     if(data.header) 
     { 
      var i; 
      for(i in data.header) 
      { 
       var editor = data.header[i]['editor']; 
       if(editor) 
       { 
        data.header[i]['editor'] = new Function("container", "options", editor); 
       } 
      } 
     } 
    .... 
+0

什麼是您需要在json中將函數作爲字符串傳遞的用例?看起來像設計缺陷 – charlietfl

+0

我正在使用sails.js並在我的服務器上設計我的模型。我添加了一些自定義參數,如下拉列表...然後我在服務器中構建我的網格配置並將其發送到我的客戶端。 json裝載了Kendo UI網格和所有作品。但是對於編輯部分來說,並不是因爲編輯器是一個函數。我也想創建在json中執行的函數。看到這裏:http://docs.telerik.com/kendo-ui/api/javascript/ui/grid#configuration-columns.editor – ameilland

回答

2

Althgough eval不是一個好主意,它可能是唯一的選擇(假設你不改變你當前的實現,我覺得你應該)。

h['editor'] = eval('('+editor+')'); 

我覺得不好推薦eval


作爲一個側面說明,一個快速的方法來避免eval是JSON字符串(大括號之間的部分)返回功能的只有身體:

var editor = 'jsdd.appendTo(container); $compile(editor)($scope); editor.css("visibility", "visible");' 

然後定義header['editor']像這個:

header['editor'] = new Function("container","options",editor); 
+0

Upvote對推薦'eval'感覺不好。 –

+0

解決方案的問題在於,編輯器是列數組的一部分。每列可以有一個編輯器。所以我需要遍歷每一列併爲每個編輯器屬性添加eval。我該怎麼做?我可以不刪除檢索到的json引號嗎?例如,對於數字或布爾屬性,我沒有引號。我希望編輯器功能也一樣。 – ameilland

+0

您可以從kendo ui網格中看到: columns.editor:功能 提供一種指定列的自定義編輯用戶界面的方法。使用容器參數來創建編輯UI。 鏈接:http://docs.telerik.com/kendo-ui/api/javascript/ui/grid#configuration-columns.editor – ameilland

0

我認爲$parse是你正在尋找。我可能會錯過一些上下文,但這似乎是一個奇怪的用例。爲什麼不只是在http請求中獲得.js文件,而不是在JSON對象業務中使用字符串化的JS?

+0

我使用Kendo UI網格。我在服務器中有我的網格模型。我設置了一些屬性,併發送一個JSON到我的客戶端,其中包含整個網格配置。網格配置是建立在服務器上的。如果我需要一個編輯器下拉菜單,設置kendoui的唯一方法是用函數定義它。問題是用引號將函數解釋爲一個字符串。 – ameilland