Сопоставление Knockout.JS с наблюдаемым и наблюдаемым массивом

Я не могу понять, почему мой ko.mapping работает нормально, когда я возвращаю массив (используя привязку foreach), но когда это один объект (используя привязку with), он не работает вообще. Я не получаю никаких ошибок, но я также не получаю никаких результатов:

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() в массив и снова использовать foreach следующим образом:

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"}

person Mike Thibault    schedule 19.04.2013    source источник
comment
Как выглядят данные JSON, возвращаемые вашим API? Это определит результирующий тип объекта Javascript.   -  person Justin Helgerson    schedule 19.04.2013
comment
Только что отредактировал исходный пост с образцами JSON   -  person Mike Thibault    schedule 19.04.2013


Ответы (1)


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

person Michael Best    schedule 19.04.2013
comment
Это привело меня на правильный путь; self.singleEvent(ko.mapping.fromJS(allData)); в успехе getSingleEvent() сделал свое дело! Спасибо! - person Mike Thibault; 19.04.2013