因为 JSON ISO8601 格式的日期只是字符串,所以没有神奇的方法来解析它们。您需要声明或检测应解析的字段。
声明很简单,只需在模型上定义一组日期字段并解析它们。
//declare dateFields on the model
var TestModel = Backbone.Model.extend({
dateFields: [
'createdDate',
'updatedDate'
]
});
//override toJSON
Backbone.Model.prototype.toJSON = function() {
return this._parseDates(this.attributes);
};
//hydrates string dates to Date objects
Backbone.Model.prototype._parseDates = function(attrs) {
attrs = _.clone(attrs);
if(!this.dateFields) { return attrs; }
_.each(this.dateFieds, function(field) {
attrs[field] = new Date(attrs[field]);
});
return atts;
};
这需要您告诉日期解析器要考虑哪些字段。由于您希望获得更自动的东西,另一种选择是尝试通过查看每个字符串值的形状来检测哪些字段是日期:
//hydrates string dates to Date objects
Backbone.Model.prototype._parseDates = function(attrs) {
attrs = _.clone(attrs);
var iso8601Pattern = /^[0-9][0-9][0-9][0-9](-[0-1][0-9](-[0-3][0-9](T[0-9][0-9](:[0-9][0-9](:[0-9][0-9])(\.[0-9][0-9][0-9]?)?)?)?)?)?Z$/;
_.each(attrs, function(value, key) {
if(_.isString(value) && iso8601pattern.test(value)) {
attrs[key] = new Date(value);
}
});
return attrs;
};
这不需要您列出所有日期字段,但会增加解析的开销,因为它需要测试每个值以查看它是否看起来像一个日期。