【问题标题】:Knockout.js update a view modelKnockout.js 更新视图模型
【发布时间】:2013-07-09 11:45:55
【问题描述】:

在页面加载时,我将 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/ 自动映射对象。

任何指针都会有所帮助

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

    我希望这会有所帮助!

    【讨论】:

    • 现货 :) 我最终使用了 ko.viewModel.updateModel(jsonModel.availables, data.d);但这会导致我的 UI 由于脚本运行时间较长而挂起
    • 当您在更改可观察数组时发现运行时间较长时,请检查在每个元素上运行的复杂进程(自定义绑定?),或者为每个项目重新计算的淘汰计算。
    • @RyanRahlf 这可以与映射插件一起使用吗?我发现我需要在我的 ajax 回调中调用 applybindings。否则,模型不会更新。我认为映射插件会破坏订阅的元素并且无法更新它。 stackoverflow.com/questions/21558075/…
    • @Vyache,您不需要在 ajax 调用后再次调用 applyBindings。这篇博文可能会有所帮助:ryanrahlf.com/…
    猜你喜欢
    • 2016-01-18
    • 2012-12-11
    • 1970-01-01
    • 2012-07-26
    • 2012-10-03
    • 1970-01-01
    • 2014-01-03
    • 2015-04-15
    • 2012-09-08
    相关资源
    最近更新 更多