我从服务器中获取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);
        };
    });
}

控制台消息全部显示了新数据,但我的视图从未更新。

有帮助吗?

解决方案

我相信问题是您传递到的参数顺序 ko.mapping.fromJS 更新时功能 contract_model.

你有:

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

你要:

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

其他提示

@seth.miller的答案是正确的。如果您的 contract_model 是早些时候绘制的。如果只有两个论点, ko.mapping.fromJS 检查第二个参数是否具有 "__ko_mapping__" 财产。如果是这样,它将其视为目标,否则将其视为选项对象。

根据 @dbueno的观察 - 对于使用Typescript的任何人,我强烈建议您从您的 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__ 属性)它将始终复制属性。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top