我在富Web客户端中使用了 Knockout.js + Knockout映射插件 + jQuery 的组合一个RESTful API。
我需要在视图模型中对如何处理空值提供一些指导。这是我的场景和我遇到的问题:
REST API返回的大多数数据成员都是可以为空的。为了解释这一点,我将传递给映射插件一个带有空值的JSON样本:
um.jsonMaps.campaign = {
"priority": null,
"recipientListId": null,
"autoPrepare": null,
"timeToSend": null
}
我像这样做初始绑定:
this.model = ko.mapping.fromJS(um.jsonMaps.campaign);
以下是来自API调用的一些数据:
var data= {
"priority": 95,
"recipientListId": "a2aac72a-59f6-45da-a636-a48cc2b20137",
"autoPrepare": false,
"timeToSend": null
}
......这样绑定:
ko.mapping.fromJS(data, this.viewModel.model);
问题是指如果用户修改或触摸绑定到此数据的任何UI元素,他们会隐式将模型中的数据成员转换为引用的字符串文字 。因此,如果用户添加一些文本并将其删除,则 95 整数将变为 “95” 。如果在UI中触摸了API中的null值,它将变为“”(例如空字符串)。
我需要整数和空值在编辑后保持为整数和空值。
答案 0 :(得分:3)
在我的项目中,我最终创建了来自服务器的数据视图模型。我使用getter和setter添加了新属性,以便在需要时写入数值:
function DataViewModel(dataModel) {
var self = this;
self.priority = ko.observable(dataModel.priority);
self.recipientListId = ko.observable(dataModel.recipientListId);
self.autoPrepare = ko.observable(dataModel.autoPrepare);
self.timeToSend = ko.observable(dataModel.timeToSend);
self.priorityKo = ko.computed({
read: function () {
return self.priority().toFixed(2);
},
write: function (value) {
value = parseFloat(value.replace(/[^\.\d]/g, ""));
if (isNaN(value)) {
self.priority(-1); // to fire 'changed' event
self.priority(0); // final value in case of incorrect user input
} else {
self.priority(value); // real numeric value
}
},
owner: this
});
您的映射将如下所示:
this.model = ko.mapping.fromJS(new DataViewModel(um.jsonMaps.campaign));
答案 1 :(得分:1)
你可以使用Ryan的Smart Dirty Flag扩展作为如何处理它的基础。
或者你可以手动完成同样的事情,但他的文章仍然是你正在处理的事情的一个很好的起点。