1

ISO 日付をバックボーン モデルの javascript 日付として解析する方法はありますか。一部の 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 プロトタイプで何らかの方法で実行できませんでした。このように、日付型のすべてのモデル プロパティでこの実装を作成する必要があります。これはあまり DRY ではありません。

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 に答える