Knockout.js更新视图模型

时间:2013-07-09 11:45:56

标签: knockout.js knockout-2.0 knockout-viewmodel-plugin

在页面加载时,我正在将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);

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

我尝试了以下方法

  1. 将data.d推入oldModel.availables observable。当我推送数据时,aray对象不会被转换为observable,但是这些项目被添加到availables数组中。而在初始(页面加载时),对象转换没有问题。

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

    ko.viewmodel.updateFromModel(oldModel,updatedModel);

  3. 旧模型的剪辑

    Old Model

    更新模型的剪辑

    Updated Model

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

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

    任何指针都会有所帮助

1 个答案:

答案 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/

我希望这有帮助!