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

use*_*689 5 jquery knockout-mapping-plugin knockout.js

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

{"HaveNotification":false,"IsError":false,"Title":null,"Description":null}
Run Code Online (Sandbox Code Playgroud)

并尝试通过ko.mapping填充此视图模型:

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

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

function pollNotifications() {

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

    ko.mapping.fromJSON(data, notifyVM);

    setTimeout(pollNotifications, 10000);
  });
}
Run Code Online (Sandbox Code Playgroud)

这是页面加载代码:

$(function () {

  ko.applyBindings(notifyVM);

  setTimeout(pollNotifications, 10000);
});
Run Code Online (Sandbox Code Playgroud)

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

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

var newVM = ko.mapping.fromJSON(data);
Run Code Online (Sandbox Code Playgroud)

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

小智 9

尝试:

ko.mapping.fromJS(data, {}, notifyVM);
Run Code Online (Sandbox Code Playgroud)

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

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


Kar*_*son -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);
    });
}
Run Code Online (Sandbox Code Playgroud)

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