0

在页面加载时,我正在将 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 服务器函数来更新此视图模型。

在 tha ajax 成功回调中,我写过

 var updatedModel = {
                availables: ko.observableArray([])

            };
            updatedModel.availables = ko.viewmodel.fromModel(data.d);

当我尝试使用此更新模型更新视图模型时,我的整个模型变为空白

我尝试了以下方法

  1. 将 data.d 推送到 oldModel.availables 可观察对象中。当我推送数据时,数组对象不会被转换为可观察对象,而是将项目添加到可用数组中。而在最初(页面加载时),对象被转换没有问题。

  2. 尝试直接更新视图模型,在这种情况下整个模型变为空白

    ko.viewmodel.updateFromModel(oldModel, updatedModel);

旧模型截图

旧型号

更新模型的片段

更新模型

正如我所说,当我直接推送数组对象(data.d)时,不会像 ajax 之前的第一种情况那样自动创建可观察对象。

为什么在逻辑相同的情况下会发生这种情况?我正在使用http://coderenaissance.github.io/knockout.viewmodel/自动映射对象。

任何指示都会有所帮助

4

1 回答 1

3

Rohith,这里的答案将取决于您从 ajax 调用返回的内容。

而不是创建updateModel,我相信你想要的ajax调用的回报

ko.viewModel.updateModel(jsonModel.availables, data.d);

如果您从 Ajax 调用返回的 data.d 不需要任何特殊映射(即它只是一个不需要可观察对象的对象数组),您可以直接更新您的模型

//ko.viewModel.updateModel(jsonModel.availables, data.d);
jsonModel.availables(data.d);

您遇到的根本问题是您已经失去了您的视图所绑定的可观察对象。通过覆盖它或忽略它并更新不同的模型(在本例中为 updateModel),您将丢失 jsonModel.availables。

我正在写一篇关于使用 AJAX 时这个确切问题的博客文章,但您可以在这篇文章的第三部分看到您遇到的部分问题:http ://ryanrahlf.com/getting-started-with -knockout-js-3-things-to-know-on-day-one/

我希望这有帮助!

于 2013-07-09T15:21:57.007 回答