淘汰映射JSON更新现有视图模型

时间:2013-08-01 00:44:30

标签: jquery knockout.js knockout-mapping-plugin

我有来自服务器的这个JSON数据:

{"HaveNotification":false,"IsError":false,"Title":null,"Description":null}

我正在尝试通过ko.mapping填充此视图模型:

var notifyVM = {
  HaveNotification: ko.observable(true),
  IsError: ko.observable(false), 
  Title: ko.observable('Title goes here'), 
  Description: ko.observable('Description goes here'), 
}

使用此代码,在轮询间隔调用:

function pollNotifications() {

  $.getJSON('@Url.Action("GetNotifications", "Home")', function (data) {

    ko.mapping.fromJSON(data, notifyVM);

    setTimeout(pollNotifications, 10000);
  });
}

这是页面加载代码:

$(function () {

  ko.applyBindings(notifyVM);

  setTimeout(pollNotifications, 10000);
});

但它不起作用。如果我在fromJSON调用之后检查视图模型,则不会更新observable,它们仍处于初始值。

更新: 更多信息......如果我在pollNotifications函数中执行此操作

var newVM = ko.mapping.fromJSON(data);

我注意到它创建的视图模型与我的视图模型不同,它由一个可观察的函数组成,而我的是一个具有一组可观察属性的对象。

3 个答案:

答案 0 :(得分:8)

尝试:

ko.mapping.fromJS(data, {}, notifyVM);

两个参数形式需要一个先前使用ko.mapping.fromJS创建的视图模型。如果找不到(基于查找来自于JS添加的特定属性),它会假定您正在调用fromJS(数据,选项)表单。

3参数表格消除了这种歧义。

答案 1 :(得分:0)

您是否尝试过手动将值映射到视图模型并查看是否有效?如此?

function pollNotifications() {
    $.getJSON('@Url.Action("GetNotifications", "Home")', function (data) {
        notifyVM.HaveNotification(data.HaveNotification);
        notifyVM.IsError(data.IsError);
        notifyVM.Title(data.Title);
        notifyVM.Description(data.Description);

        setTimeout(pollNotifications, 10000);
    });
}

如果上述方法不起作用,那么您就知道这是您的数据问题;否则ko.mapping.fromJSON()无法正确进行映射。

答案 2 :(得分:0)

你应该使用ko.mapping.fromJS而不是ko.mapping.fromJSON,因为$ .getJSON正在返回一个数据对象(而不是一个json字符串):

  

成功回调传递返回的数据,该数据通常是JSON结构定义的JavaScript对象或数组,并使用$ .parseJSON()方法进行解析。它还传递了响应的文本状态。

http://api.jquery.com/jquery.getjson/

做一个console.log(数据);看到差异