quintout.js ko.mapping.tojs在我看来没有刷新数据
-
25-10-2019 - |
题
我从服务器中获取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;
是的 - 只是评论。
然后,如果您尝试做:
ko.mapping.fromJS(item.data, item.target);
您可以用更安全的
ko.mapping.fromJS(item.data, {}, item.target);
更安全,因为是否 item.target
以前已被映射过(因此, __ko_mapping__
属性)它将始终复制属性。
不隶属于 StackOverflow