Knockout映射插件和moment.js日期兼容性

时间:2013-06-06 06:58:06

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

当源数据包含knockout mapping plugin个日期时,我使用moment.js收到以下错误。

TypeError: this._d.getUTCDay is not a function
https://raw.github.com/timrwood/moment/develop/moment.js
Line 1300

我有一个非常简单的模型,如下所示。如果我使用

birthDate: new Date(2013, 6, 1)

它工作正常,但如果我将其更改为

birthDate: moment().add('days', -5)

它引发了上述错误。

JS Fiddle

var NS = NS || {};

$(function () {

    NS.ViewModel1 = function (data) {
        var self = this;

        self.firstName = data && data.firstName || "Hello";
        self.lastName = data && data.lastName || "There";
        self.birthDate = data && data.birthDate || new Date(2000, 11, 17);
    };

    var data = {
        firstName: "John",
        lastName: "Doe",
        //birthDate: new Date(2013, 6, 1) // Works
        birthDate: moment().add('days', -5)
    };

    var vm1 = new NS.ViewModel1();
    console.log(vm1);
    ko.mapping.fromJS(data, {}, vm1);
    console.log(vm1);
    ko.applyBindings(vm1, document.getElementById("observableSection"));
});

1 个答案:

答案 0 :(得分:1)

调用moment().add('days', -5)返回一个“时刻”对象,它是一个日期周围的包装器对象,无法通过映射插件进行映射。

如果您希望将日期作为格式化字符串,则需要调用.toDate()doc)获取JavaScipt日期或.format()doc):

所以以下内容应该有效:

var data = {
    firstName: "John",
    lastName: "Doe",
    birthDate: moment().add('days', -5).toDate()
};

演示JSFiddle.