2013-05-02 3 views
1

Возможно ли, чтобы плагин Mapping Knockout.js получал доступ к вложенным данным json или мог ли он находить только данные первого уровня?Плагин отображения Knockout.js, доступ к нескольким уровням jonn вложенных уровней

Если плагин сопоставления не может получить доступ к вложенным данным, есть ли другое решение?

В моем примере «Число» правильно отображается, но «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); 
Смежные вопросы