在页面加载时,我正在将JSON数据转换为像这样的
模型var jsonField = '#' + '<% = hdnField.ClientID %>';
jsonModel= {
availables: ko.observableArray([])
};
var valueField = $(jsonField)[0].value;
var arrayGroup = $.parseJSON(valueField);
jsonModel.availables = ko.viewmodel.fromModel(arrayGroup);
var block=$('#availabilitiesBlock')[0];
ko.applyBindings(jsonModel,block);
页面加载后,我调用ajax服务器函数来更新此视图模型。
在ajax成功回电中我写了像
var updatedModel = {
availables: ko.observableArray([])
};
updatedModel.availables = ko.viewmodel.fromModel(data.d);
当我尝试使用此更新模型更新视图模型时,我的整个模型变为空白
我尝试了以下方法
将data.d推入oldModel.availables observable。当我推送数据时,aray对象不会被转换为observable,但是这些项目被添加到availables数组中。而在初始(页面加载时),对象转换没有问题。
尝试直接更新视图模型,在这种情况下,整个模型变为空白
ko.viewmodel.updateFromModel(oldModel,updatedModel);
旧模型的剪辑
更新模型的剪辑
正如我所说,当我直接推送数组对象(data.d)时,不会像在ajax之前的第一种情况那样自动创建observable。
当逻辑相同时,为什么会发生这种情况?我正在使用http://coderenaissance.github.io/knockout.viewmodel/自动映射对象。
任何指针都会有所帮助
答案 0 :(得分:3)
Rohith,答案取决于你从ajax电话中回来的内容。
我不相信创建updateModel,而是相信你想要的ajax调用返回
ko.viewModel.updateModel(jsonModel.availables, data.d);
如果从Ajax调用返回的data.d不需要任何特殊的映射(即它只是一个不需要observable的对象数组),你可以直接更新你的模型
//ko.viewModel.updateModel(jsonModel.availables, data.d);
jsonModel.availables(data.d);
您遇到的根本问题是您一直在丢失视图绑定的可观察对象。你通过覆盖它来丢失jsonModel.availables,或者忽略它并更新不同的模型(在这种情况下是updateModel)。
我正在撰写关于使用AJAX时这个问题的博客文章,但您可以在本文的第三部分中看到您遇到的部分问题:http://ryanrahlf.com/getting-started-with-knockout-js-3-things-to-know-on-day-one/
我希望这有帮助!