Knockout.js ko.mapping.toJS не обновляет данные, на мой взгляд - PullRequest
6 голосов
/ 16 февраля 2012

Я получаю объект json с сервера и заполняю мое представление.Затем я изменяю данные, отправляю их обратно на сервер.Затем я получаю новую копию данных, надеясь, что она обновит мой взгляд при любых изменениях.Однако этого не происходит.TIA

$(document).ready(function() {
    var customer_id = get_customer_id();
    var data = load_model();
    contract_model = ko.mapping.fromJS(data,{});
    ko.applyBindings(contract_model);
}

function load_model(){
    var url = '/ar/contract_json?contract_id='+get_contract_id();
    var data = '';
    $.ajax({
        type:'GET',
        url:url,
        async:false,
        success: function(returningValue){
            data = returningValue;
        }
    });
    return data;
}

Эта начальная загрузка работает нормально.Затем я делаю некоторые вещи и меняю одну из наблюдаемых и отправляю эти данные обратно на сервер.Сервер получает обновление, а затем я делаю новую выборку данных, чтобы обновить представление (я знаю, что могу передать новые данные за один шаг, но это в коде, который я еще не реорганизовал).

function refresh_data(contract_model){
    var url = '/ar/contract_json?contract_id='+get_contract_id();
    $.post(url,function(data){
        console.log(data);
        ko.mapping.fromJS(contract_model,{},data);
        ko.applyBindings(contract_model);
        console.log(ko.mapping.toJS(contract_model))
    });

}

function refresh_data(contract_model){
    var url = '/ar/contract_json?contract_id='+get_contract_id();
    $.post(url,function(data){
        console.log(data);
        ko.mapping.fromJS(contract_model,{},data);
        console.log(ko.mapping.toJS(contract_model))
    });

}

function push_model(contract_model,refresh){
    var url = '/ar/update_contract';
    var data = {'contract':ko.mapping.toJSON(contract_model)}

    delete data['lines'];
    $.post(url,data,function(return_value){
        if (refresh){
            refresh_data(contract_model);
        };
    });
}

Все сообщения консоли показывают, что возвращаются новые данные, но мой взгляд никогда не обновляется.

Ответы [ 3 ]

21 голосов
/ 16 февраля 2012

Я считаю, что проблема заключается в порядке параметров, которые вы передаете в функцию ko.mapping.fromJS при обновлении contract_model.

У вас есть:

ko.mapping.fromJS(contract_model,{},data);

, который вы хотите:

ko.mapping.fromJS(data, {}, contract_model);
3 голосов
/ 11 декабря 2012

@seth.miller ответ правильный. Вы также можете пропустить средний параметр "options", если ваш contract_model тот же, что был отображен ранее. Если есть только два аргумента, ko.mapping.fromJS проверяет, имеет ли второй аргумент свойство "__ko_mapping__". Если это так, он рассматривает его как цель, в противном случае он обрабатывает его как объект параметров.

1 голос
/ 13 мая 2015

На основании наблюдения @ DBueno - всем, кто использует машинопись, я настоятельно рекомендую закомментировать подпись этого метода из вашего файла knockout.mapping.d.ts.

// fromJS(jsObject: any, targetOrOptions: any): any;

Да - просто закомментируйте.

enter image description here

После этого вы получите ошибку времени компиляции:

ko.mapping.fromJS(item.data, item.target);

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

ko.mapping.fromJS(item.data, {}, item.target);

Безопаснее, поскольку, независимо от того, было ли ранее сопоставлено item.target (и, следовательно, будет иметь свойство __ko_mapping__), оно всегда будет копировать свойства.

...