Knockout.js js更新视图模型

Knockout.js js更新视图模型,knockout.js,knockout-2.0,knockout-viewmodel-plugin,Knockout.js,Knockout 2.0,Knockout Viewmodel Plugin,在页面加载时,我将JSON数据转换为如下视图模型 var jsonField = '#' + '<% = hdnField.ClientID %>'; jsonModel= { availables: ko.observableArray([]) }; var valueField

在页面加载时,我将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);
当我尝试使用此更新的模型更新视图模型时,整个模型将变为空白

我尝试了以下方法

  • 将数据.d推入oldModel.availables observable。当我推送数据时,aray对象没有被转换为可观察对象,而是被添加到availables数组中。而在初始(页面加载时)中,对象转换没有问题

  • 尝试直接更新viewmodels,在这种情况下,整个模型将变为空白

    ko.viewmodel.updateFromModel(oldModel,updateModel)

  • 旧式剪报

    更新模型的剪报

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

    当逻辑相同时,为什么会发生这种情况?我正在使用自动映射对象


    任何指针都会很有用,这里的答案取决于ajax调用返回的内容

    我不创建updateModel,而是相信ajax调用会返回您想要的结果

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

    //ko.viewModel.updateModel(jsonModel.availables, data.d);
    jsonModel.availables(data.d);
    
    你所遇到的潜在问题是,你一直在失去你的视图所绑定的可观察性。通过覆盖jsonModel.availables,或者忽略它并更新另一个模型(本例中为updateModel),您将丢失它

    我正在写一篇关于使用AJAX时这个问题的博客文章,但是您可以在本文的第三部分看到您遇到的部分问题:


    我希望这有帮助

    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);
    
    你所遇到的潜在问题是,你一直在失去你的视图所绑定的可观察性。通过覆盖jsonModel.availables,或者忽略它并更新另一个模型(本例中为updateModel),您将丢失它

    我正在写一篇关于使用AJAX时这个问题的博客文章,但是您可以在本文的第三部分看到您遇到的部分问题:


    我希望这有帮助

    重点:)我最终使用了ko.viewModel.updateModel(jsonModel.availables,data.d);但这会导致我的UI挂起,因为脚本运行时间较长当您在更改可观察数组时看到运行时间较长,请检查在每个元素上运行的复杂进程(自定义绑定?)或正在为每个项重新计算的淘汰计算。@RyanRahlf这是否适用于映射插件?我发现我需要调用ajax回调中的applybindings。否则,模型不会更新。我认为映射插件破坏了订阅的元素,它无法更新它@Vyache,在ajax调用之后,您不需要再次调用applyBindings。这篇博文可能会有所帮助:spot on:)我最终使用了ko.viewModel.updateModel(jsonModel.availables,data.d);但这会导致我的UI挂起,因为脚本运行时间较长当您在更改可观察数组时看到运行时间较长,请检查在每个元素上运行的复杂进程(自定义绑定?)或正在为每个项重新计算的淘汰计算。@RyanRahlf这是否适用于映射插件?我发现我需要调用ajax回调中的applybindings。否则,模型不会更新。我认为映射插件破坏了订阅的元素,它无法更新它@Vyache,在ajax调用之后,您不需要再次调用applyBindings。这篇博文可能会有帮助: