2013-10-09 2 views
1

У меня есть модель с наблюдаемым и наблюдаемым массивом. Щелчок на кнопке означает, что для заполнения объекта JSON и сопоставления его с моделью просмотра ..., который, я считаю, должен «заполнить» наблюдаемый массив. Нажатие кнопки происходит. Нет ошибок. Если я пройду через отладчик, когда происходит сопоставление, то наследуемый объект заселяется, но obserableArray этого не делает. Это означает, что объекты HTML, которые предполагается отображать на основе наблюдаемого массива, не обновляются.Нокаут maping.fromJS для наблюдаемого массива из объекта json. Данные теряются

HTML:

<div data-bind="if: ErrorMessages().length"> <span>Error Messages</span> 
    <ul data-bind="foreach: ErrorMessages"> 
     <li> <span data-bind="text: Description"></span> 
     </li> 
    </ul> 
</div> 
<button data-bind="click: ShowErrors">Go</button> 

var ViewModel = function() { 
    var me = this; 
    me.AData = ko.observable(); 
    me.ErrorMessages = ko.observableArray([]); 

Javascript:

me.ShowErrors = function() { 


     var testdata = { 
      AData: { 
       Something: 1 
      }, 
      ErrorMessages: [{ 
       Description: 'Error #1', 
       Code: '01' 
      }, { 
       Description: 'Error #2', 
       Code: '02' 
      }] 
     }; 
     var jsonData = ko.toJSON(testdata); 

     ko.mapping.fromJS(jsonData, {}, me); 
    }; 
}; 
ko.applyBindings(new ViewModel()); 

http://jsfiddle.net/Eves/v9SEk/4/

Мой реальный код протягивается и получает данные из веб-службы. Я считаю, что создание объекта и преобразование его в JSON, а затем его отображение с помощью ko.mapping.fromJS лучше всего отражает то, что происходит. Anyways ...

Я подозреваю, что я сделал что-то глупое или, по крайней мере, принял то, что я не должен был иметь.

+0

ko.mapping.js не найден в ваших внешних ресурсах, поэтому THAT не работает –

+0

knockout.mapping.js находится в jsfiddle "External Resources". Разве это не так? – Eves

+0

LOL ... какая ужасная копия и вставка работы я сделал. Внешние ресурсы должны быть исправлены в настоящее время. Однако проблема все еще существует – Eves

ответ

2

Вы преобразовываете в JSON с ko.toJSON(testdata), но вы не читаете JSON с ko.mapping.fromJS(jsonData, {}, me);, а с простого объекта JS.

toJSON и fromJSON метод должен быть использован в парах:

var jsonData = ko.toJSON(testdata); 

ko.mapping.fromJSON(jsonData, {}, me); 

и то же самое относится и к toJS и fromJS:

var jsonData = ko.toJS(testdata); 

ko.mapping.fromJS(jsonData, {}, me); 

Demo JSFiddle.

+0

Да, это исправляет jsfiddle. Благодарю. Теперь я просто должен применить это к бессмыслице, которая является моим настоящим кодом. – Eves

Смежные вопросы