Knockout.js ko.mapping.toJS在我的视图中没有刷新数据

Omi*_*nus 6 javascript knockout-mapping-plugin knockout.js

我从服务器获取一个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;
}
Run Code Online (Sandbox Code Playgroud)

这个初始加载工作正常.然后我做了一些事情并更改了一个observable并将数据推送回服务器.服务器获取更新,然后我重新获取数据,以便视图将刷新(我知道我可以一步传回新数据,但这在代码中我还没有重构).

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);
        };
    });
}
Run Code Online (Sandbox Code Playgroud)

控制台消息都显示新数据返回但我的视图永远不会更新.

set*_*ler 21

我相信问题在于ko.mapping.fromJS您在更新时传递给函数的参数顺序contract_model.

你有:

ko.mapping.fromJS(contract_model,{},data);
Run Code Online (Sandbox Code Playgroud)

你要:

ko.mapping.fromJS(data, {}, contract_model);
Run Code Online (Sandbox Code Playgroud)

  • 对于映射插件的KnockOut文档,IMO,在调用ko.mapping.fromJS(...)的语法上是错误的.文档显示以下内容:ko.mapping.fromJS(data,viewModel),但显然应该是:ko.mapping.fromJS(data,{},viewModel) (12认同)