5

我有来自服务器的 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 调用后检查视图模型,则未更新可观察对象,它们仍处于初始值。

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

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

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

4

3 回答 3

10

尝试:

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

两个参数表单需要一个先前使用 ko.mapping.fromJS 创建的视图模型。如果它没有找到(基于查找 fromJS 添加的特定属性),它假定您正在调用 fromJS(data, options ) 表单。

3 参数形式消除了这种歧义。

于 2015-02-24T00:20:25.787 回答
0

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

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

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

做一个 console.log(data); 看看有什么不同

于 2014-05-28T16:44:01.620 回答
-1

您是否尝试过手动将值映射到视图模型并查看是否有效,像这样?

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()

于 2013-08-01T00:58:43.533 回答