Использование updateFromJS заменяет значения, когда они должны быть добавлены - PullRequest
0 голосов
/ 23 февраля 2011

У меня есть этот код:

var attachmentsModel = {
    convAttachments: ko.mapping.fromJS([])
};

$(function() {
    ko.applyBindings(attachmentsModel)
    refreshConvAttachments();
});

function refreshConvAttachments() {
    $.ajax({
        url: '/xxxxxxx/',
        success: function (dataJS) {
            // Send KO the data
            ko.mapping.updateFromJS(attachmentsModel.convAttachments, dataJS);
        }
    }); 
}

Вызов AJAX выше возвращает:

[{
    "title": "BillGates",
    "added_by": "xxx",
    "thumb": "urlhere",
    "id": 410,
    "link": "/link/410",
    "added_on": "2011-02-22T12:57:09-08:00"
}, {
    "title": "biz-stone",
    "added_by": "xxx",
    "urlhere",
    "id": 411,
    "link": "/link/411",
    "added_on": "2011-02-22T12:57:53-08:00"
}]

Это отлично работает. Позже, хотя пользователь может добавить вложение, и вот где оно разрывается. Добавляя новое вложение в режим и отображая на странице, он удаляет все ранее загруженные элементы в attachmentsModel.convAttachments.

Позже это происходит:

ko.mapping.updateFromJS(attachmentsModel.convAttachments, file);

Ajax Returns:

[{
    "title": "eric_schmidt",
    "added_by": "xxx",
    "thumb": "xxxxxx",
    "id": 417,
    "link": "/link/417",
    "added_on": "2011-02-22T13:16:45-08:00"
}]

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

Ответы [ 2 ]

4 голосов
/ 23 февраля 2011

ko.mapping.updateFromJS () ожидает, что вы получаете полный список элементов, который был изначально подготовлен с помощью ko.mapping.fromJS (). Любые элементы, отсутствующие в оригинале, считаются удаленными, а любые новые элементы в обновлениях считаются дополнениями. Таким образом, в настоящее время плагин сопоставления не позволяет вам делать постепенные обновления таким способом.

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

0 голосов
/ 24 февраля 2011

вы всегда можете попробовать использовать

$.extend(attachmentsModel.convAttachments,ko.mapping.fromJS(dataJS));

Хотя я не совсем уверен, что это обновит все привязки должным образом, вам, возможно, придется ответить на привязку, вызвав

ko.applyBindings(attachmentsModel)
...