是否有可能扩展knockout映射插件以在取消映射时处理不同类型的映射?
我有这个型号:
var Model = function () {
var self = this;
self.requestFrom = ko.observable(moment().subtract("days", 1));
self.requestTo = ko.observable(moment());
// additional properties.
};
为了得到一个简单的JavaScript对象,我正在做:
var model = new Model();
var obj = mapping.toJS(model, {
"ignore": ["requestFrom", "requestTo"]
});
obj.requestFrom = model().requestFrom().toISOString();
obj.requestTo = model().requestTo().toISOString();
我想避免手动处理矩形对象的转换,而是将一些扩展写入知道如何处理类型矩对象的knockout映射,并将它们作为ISO字符串表示返回。
有什么想法吗?
答案 0 :(得分:2)
当您将对象作为Ajax参数传递时,通常会自动调用toJSON()
。
这可能不是您正在寻找的答案,但我认为在您的模型上添加自定义toJSON()
非常有用。您可以非常精确地控制数据的哪个部分以及以何种格式发送。
var Model = function () {
var self = this;
self.requestFrom = ko.observable(moment().subtract("days", 1));
self.requestTo = ko.observable(moment());
// additional properties.
self.toJSON = function()
{
return {
requestFrom: self.requestFrom(),
requestTo: self.RequestTo(),
otherProperty: self.otherProperty()
}
}
};
您可以直接在Ajax请求中使用它,而无需手动转换它。
var model = new Model();
$.ajax({
url: '/test/PersonSubmit',
type: 'post',
dataType: 'json',
data: model
});
请注意,moment()的默认toJSON()实现已经是toISOString()。请参阅moment.js的源代码:
// add aliased format methods
moment.fn.toJSON = moment.fn.toISOString;
答案 1 :(得分:1)
您是否考虑过使用原型来扩展ko
对象?我会将observable
方法克隆到一个新的momentObservable
方法中,然后可以这样调用:
var Model = function () {
var self = this;
self.requestFrom = ko.momentObservable.subtract("days", 1));
//other operations
};