我有来自服务器的这个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);
我注意到它创建的视图模型与我的视图模型不同,它由一个可观察的函数组成,而我的是一个具有一组可观察属性的对象。
答案 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(数据);看到差异