6

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

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

4

3 回答 3

21

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

你有:

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

你要:

ko.mapping.fromJS(data, {}, contract_model);
于 2012-02-16T02:42:02.877 回答
3

@seth.miller 的回答是正确的。如果您contract_model的参数与之前映射的参数相同,您也可以省略中间的“选项”参数。如果只有两个参数,ko.mapping.fromJS则检查第二个参数是否具有"__ko_mapping__"属性。如果是,则将其视为目标,否则将其视为选项对象。

于 2012-12-11T16:06:11.460 回答
1

根据@DBueno 的观察 - 对于使用打字稿的任何人,我强烈建议从您的knockout.mapping.d.ts文件中注释掉这个方法签名。

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

是的 - 只需将其注释掉。

在此处输入图像描述

如果您尝试这样做,您将收到编译时错误:

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

你可以用更安全的替换它

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

更安全,因为无论item.target之前是否已映射(因此会有一个__ko_mapping__属性),它总是会复制属性。

于 2015-05-13T06:52:40.797 回答