1

Я не могу понять, почему мой ko.mapping работает нормально, когда я возвращаю массив (используя привязку foreach), но когда это единственный объект (используя привязку «с», он вообще не работает. Я не получаю какие-либо ошибки, но я не получаю никаких результатов:Knockout.JS mapping to observable vs. observableArray

function EventViewModel() { 
    var self = this; 
    self.events = ko.observableArray([]); 
    self.singleEvent = ko.observable({}); 

    self.getEvents = function() { 
     self.events.removeAll(); 
     $.ajax("/api/Event/", { 
      contentType: "application/json", 
      success: function (allData) { 
       ko.mapping.fromJS(allData, null, self.events); 
      } 
     }); 
    }  
    self.getSingleEvent = function() { 
     self.events.removeAll(); 
     $.ajax("/api/Event/?guid=435a666b-7913-417f-a474-dfb33d74c2ec", { 
      contentType: "application/json", 
      success: function (allData) { 
       ko.mapping.fromJS(allData, null, self.singleEvent); 
      } 
     }); 
    } 

    self.getEvents(); 
    self.getSingleEvent(); 
}; 
window.vm = new EventViewModel(); 
ko.applyBindings(vm); 

я могу засунуть результат getSingleEvent() в массив и использовать «Еогеасп» снова, как это:

ko.mapping.fromJS([allData], null, self.singleEvent); 

и сделать singleEvent наблюдаемым массивом, который работает, но мне кажется, что это мошенник.

JSON из GetEvents() выглядит следующим образом:

[{"EventId":4,"Year":2013,"StartDate":"2013-08-28T00:00:00","EndDate":"2013-09-02T00:00:00","EventGuid":"435a666b-7913-417f-a474-dfb33d74c2ec"},{"EventId":5,"Year":2013,"StartDate":"2013-06-07T00:00:00","EndDate":"2013-06-09T00:00:00","EventGuid":"615014ba-15cd-4371-8d43-04d66eb558a2"}] 

и JSON из getSingleEvent() выглядит следующим образом:

{"EventId":4,"Year":2013,"StartDate":"2013-08-28T00:00:00","EndDate":"2013-09-02T00:00:00","EventGuid":"435a666b-7913-417f-a474-dfb33d74c2ec"} 
+0

Как выглядят данные JSON, которые возвращаются с вашего api? Это определит результирующий тип объекта Javascript. –

+0

Только что отредактировал исходное сообщение с образцами JSON –

ответ

0

Я совершенно уверен, что ko.mapping не сделать объекты видимыми. Вместо этого он делает каждое из свойств объекта наблюдаемым. С другой стороны, ничто не мешает вам просто делать self.singleEvent(allData) для установки наблюдаемого.

+0

Это привело меня к правильному пути; 'self.singleEvent (ko.mapping.fromJS (allData));' в успехе getSingleEvent() сделал трюк! Благодаря! –

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