1

有什么方法可以将 ISO 日期解析为 javascript-dates om Backbone 模型。假设一些 JSON 返回这样的模型数据:

    { prop1: "somevalue", date: "2011-05-11T18:30:00" }

为了使这项工作成为约会,我想出了这个:

    var Model = exports.Model = Backbone.Model.extend({
        toJSON: function () {
            return _.extend(this.attributes, {
                date: new Date(this.attributes.date)
            });
        }
    });

这很好用,并且可以像这样编写模板标记:

    "<%=date.toLocaleDateString() %>"

一切都很好,但不能以某种方式在 BackboneModel 原型上完成。这样我必须在每个日期类型的模型属性上编写这个实现 - 那不是很干

4

1 回答 1

8

因为 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;
};

这不需要您列出所有日期字段,但会增加解析的开销,因为它需要测试每个值以查看它是否看起来像一个日期。

于 2013-01-15T10:34:18.170 回答