使用moment.js支持扩展knockout.js映射

时间:2013-12-05 22:56:56

标签: javascript knockout.js knockout-mapping-plugin momentjs

是否有可能扩展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字符串表示返回。

有什么想法吗?

2 个答案:

答案 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

};