2013-05-02 91 views
1

Knockout.js映射插件可以訪問json嵌套數據還是隻能找到第一級數據?Knockout.js映射插件,訪問json嵌套多個級別

如果映射插件無法訪問嵌套數據,那麼還有其他解決方案嗎?

在我的示例中,「Number」正確映射,但「DueDate」不會映射。

// json with nested data 
{ 
    "Level1":[ 
     { 
     "Level2":{ 
      "DueDate":"\/Date(1362124800000)\/", 
      }, 
     "Number":5499 
     }, 
} 

// Here's my data model - I need to map the "DueDate" observable. 
var viewModel; 
$.getJSON('/myJsonData', function (data) { 
    viewModel = ko.mapping.fromJS(data); 
    ko.applyBindings(viewModel); 
}); 

回答

0

我用自制的單向遞歸映射函數。它對我來說效果很好,而且很小巧。

function convertToObservable(obj) { 
    var newObj = {}, 
     key, 
     value; 

    if (!$.isPlainObject(obj)) { 
     return obj; 
    } 

    for (key in obj) { 
     if (obj.hasOwnProperty(key)) { 
      value = obj[key]; 
      // console.log(key + ':', value); 
      newObj[key] = $.isArray(value) 
       ? ko.observableArray($.map(value, convertToObservable)) 
       : $.isPlainObject(value) ? convertToObservable(value) : ko.observable(value); 
     } 
    } 
    return newObj; 
} 

它依賴於jQuery,但可以重寫,如果不使用jQuery。

1

您確定無法訪問DueDate嗎? 因爲在我的fiddle我可以。

// json nested data 
var data = { 
    "Level1": [{ 
     "Level2": { 
      "DueDate": "\/Date(1362124800000)\/", 
     }, 
      "Number": 5499 
    }] 
}; 
var viewModel = ko.mapping.fromJS(data); 
ko.applyBindings(viewModel); 

var dueDate = viewModel.Level1()[0].Level2.DueDate; 

alert(typeof dueDate);