Nockout.js ko.mapping.tojs не освежает данные, по моему мнению
-
25-10-2019 - |
Вопрос
Я получаю объект JSON с сервера и заполняю свое представление. Затем я изменяю данные, выдвигайте их обратно на сервер. Затем я получаю новую копию данных, надеясь, что это обновит мое представление с помощью любых изменений. Однако этого не произойдет. Тиа
$(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's Ответ правильный. Вы также можете пропустить параметр «Параметры средних», если ваш 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__
свойство) Он всегда будет копировать свойства.