2013-07-09 125 views
0

在页面加载我转换JSON数据,查看模型这样Knockout.js更新视图模型

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对象不会被转换为可观察对象,而是将这些项目添加到availables数组中。而在最初(页面加载时),对象转换没有问题。

  2. 试图直接更新的ViewModels并且在这种情况下,整个模型变为空白

    ko.viewmodel.updateFromModel(oldModel,updatedModel);更新的模型

    Updated Model

    正如我所说的,当我推阵列对象直接(data.d)的

旧的剪断模型

Old Model

剪断,在ajax之前的第一种情况下,observables不会自动创建。

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

任何指针将会很有帮助

回答

3

Rohith,这里的答案将取决于你从你的Ajax调用返回的东西。

而不是创造的UpdateModel的,我相信从你的Ajax调用返回你想

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

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

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

你正在运行到根本的问题是,你已经失去了可观察到您的视图绑定。通过覆盖它,或者忽略jsonModel.availables并更新不同的模型(在这种情况下为updateModel),您将失去jsonModel.availables。

我与AJAX工作时工作的一个博客帖子这个确切问题,但你可以看到你在这篇文章中的第三部分有问题的一部分:http://ryanrahlf.com/getting-started-with-knockout-js-3-things-to-know-on-day-one/

我希望这有助于!

+0

现货:)我结束了使用ko.viewModel.updateModel(jsonModel.availables,data.d);但是由于脚本运行时间较长,导致我的用户界面挂起 –

+0

当您在更改可观察数组时看到很长的运行时间,请检查在每个元素上运行的复杂进程(自定义绑定?),还是正在重新计算的敲除计算结果计算每个项目。 –

+0

@RyanRahlf这将工作与地图插件?我发现我需要调用我的ajax回调函数中的applybindings。否则,该模型不会更新。我认为地图插件打破了订阅的元素,并且无法更新它。 http://stackoverflow.com/questions/21558075/how-do-i-update-my-model-using-ajax-and-mapping-plugin/21568045#21568045 – Vyache