20

在我的 ember-data 适配器中,我使用这一行来序列化我的模型

var data  = record.serialize();

但我注意到我的模型带有日期类型......

App.Foo = DS.Model.extend({
    start: DS.attr('date')
});

...将这样的日期发布到我的 REST api

格林威治标准时间 2013 年 3 月 2 日星期六 22:15:00

但我需要一些对 api 更友好的东西,例如 yyyy-mm-dd 或 mm/dd/yyyy

ember-data 是否提供了一个钩子来更改通过网络发送日期的方式?

我认为不是,因为这是 ember-data rev 11 中 serialize 方法的实际返回行

return dayOfWeek + ", " + dayOfMonth + " " + month + " " + utcYear + " " + pad(utcHours) + ":" + pad(utcMinutes) + ":" + pad(utcSeconds) + " GMT";

更新

我还打开了一个关于 ember-data 的问题,看看为什么选择这种格式开始

https://github.com/emberjs/data/issues/845

4

4 回答 4

14

您可以注册自定义序列化程序转换

DS.RESTAdapter.registerTransform("isodate", {
  deserialize: function(serialized) {
    return serialized;
  },

  serialize: function(deserialized) {
    return deserialized;
  }
});

然后将其用作start: DS.attr("isodate"),当然还有正确的序列化/反序列化定义:)

于 2013-03-29T01:43:43.610 回答
12

您可以按照 Jakub 在此答案中的建议注册一个新的转换。使用Ember Data 1.0.beta.1,您必须像这样在应用程序上创建一个新的转换

App.IsodateTransform = DS.Transform.extend({
  deserialize: function (serialized) {
    if (serialized) {
      return moment(serialized).toDate();
    }
    return serialized;
  },

  serialize: function (deserialized) {
    if (deserialized) {
      return moment(deserialized).toISOString();
    }
    return deserialized;
  }
});

如果不使用moment.js ,您可以更改serializeand定义。deserialize

于 2014-01-24T14:14:27.340 回答
8

Ember-Rails 解决方案:

我在 ember-rails 应用程序中使用ember-data 0.13 / ember.js 1.0.0.rc5。我发现我必须执行以下操作才能将 javascript 日期与 rails 日期匹配。

# Transforms Date to avoid miss-match with rails date
DS.JSONTransforms.isodate =
  deserialize: (serialized) ->
    if serialized
      date = new Date(serialized)
      offset = date.getTimezoneOffset()
      new Date(date.getTime()+offset*60000)
    else 
      null
    
  serialize: (date) ->
    if date then moment(date).format("YYYY-MM-DD") else null

*我正在使用moment.js进行序列化,但你自己做可能并不难。

于 2013-06-27T14:50:10.440 回答
2

不依赖 moment.js 的版本

取自https://github.com/toranb/ember-data-django-rest-adapter/issues/26

  App.IsodateTransform = DS.Transform.extend({
    deserialize: function(serialized) {

      var type = typeof serialized;

      if (type === "string") {
        return new Date(Ember.Date.parse(serialized));
      } else if (type === "number") {
        return new Date(serialized);
      } else if (serialized === null || serialized === undefined) {
        // if the value is not present in the data,
        // return undefined, not null.
        return serialized;
      } else {
        return null;
      }
    },

    serialize: function(date) {
      if (date instanceof Date) {
        return date.toJSON();
      } else {
        return null;
      }
    }
  });
于 2014-07-29T09:58:59.423 回答