KnockoutJS,在ajax调用后更新ViewModel

我正在使用Knockout和Knockout Mapping插件。

  • 我的MVC3 Action直接返回一个View而不是JSON,我将我的Model转换为JSON。
  • 这是一个数据输入表单,由于系统validation的性质,所有这些都在服务层中完成,并在ViewModel中的Response对象中返回警告。
  • 初始绑定和更新正确地处理了导致我出现问题的“更新后”行为。

我的问题是在调用AJAX POST并且接收我的JSON响应后,敲除不会更新我的所有绑定…就像observable / mappings已经下降一样

如果我包含一个额外的ko.applyBindings(viewModel); 在成功的事情确实有效…但是多个绑定会出现问题,并且我确定这不是正确的解决方案。

这是HTML / Template / Bindings

 
Correct the Following to Save
    {{each(i, warning) Response.BusinessWarnings}}
  • {{/each}}
Key Information

这就是Knockout / Script

  @{ var jsonData = new HtmlString(new JavaScriptSerializer().Serialize(Model)); } var initialData = @jsonData; var viewModel = ko.mapping.fromJS(initialData); viewModel.save = function () { this.Response = null; var data = ko.toJSON(this); $.ajax({ url: '@Url.Action("Edit")', contentType: 'application/json', type: "POST", data: data, dataType: 'json', success: function (result) { ko.mapping.updateFromJS(viewModel, result); } }); } $(function() { ko.applyBindings(viewModel); });  

这是从成功请求返回的响应JSON,包括validation消息。

 { "Id": 440, "Project_Name": "", "Response": { "HasWarning": true, "BusinessWarnings": [ { "ExceptionType": 2, "Message": "Project is invalid." }, { "ExceptionType": 1, "Message": "Project_Name may not be null" } ] } } 

UPDATE

Fiddler演示是我正在经历的修剪现场示例。 我使用返回的JSON更新了Project_Name,但是viewModel.Response对象和属性没有通过它们的数据绑定进行更新。 特别是Response.HasWarning()。

我已经改回ko.mapping.updateFromJS,因为在我的控制器中我特意返回Json(viewModel)。

清理了我的初始代码/问题以匹配演示。

我想响应是保留的,当我将“响应”更改为“resp”时,一切都很顺利。 见http://jsfiddle.net/BBzVm/

你不应该在成功活动中使用ko.mapping.updateFromJSON吗? 章节在Knockout Mapping站点上使用JSON字符串说:

如果您的Ajax调用返回JSON字符串(并且不将其反序列化为JavaScript对象),则可以使用函数ko.mapping.fromJSON和ko.mapping.updateFromJSON来创建和更新视图模型。