Подтвердить что ты не робот

Каков наилучший способ изменить формат даты, когда данные ember-data выполняют сериализацию?

В моем адаптере ember-data я использую эту строку для сериализации моей модели

var data  = record.serialize();

Но я заметил свои модели с типом даты...

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

... опубликует такую ​​дату в моем REST api

Сб, 02 Март 2013 22:15:00 GMT

Но мне нужно что-то более дружелюбное к api, например, yyyy-mm-dd или mm/dd/yyyy

Имеются ли данные ember-data, чтобы изменить, как даты отправляются по проводке?

Я бы предположил, что это не фактическая обратная линия от метода сериализации в ember-data rev 11

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

Обновление

Я также открыл проблему с ember-данными, чтобы узнать, почему этот формат был выбран для начала с

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

4b9b3361

Ответ 1

Вы можете зарегистрировать настраиваемое преобразование сериализатора

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

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

а затем просто используйте его как start: DS.attr("isodate"), с правильными определениями сериализации/десериализации, конечно:)

Ответ 2

Вы можете зарегистрировать новое преобразование, которое предложил Якуб в этом . С 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;
  }
});

Вы можете изменить определения serialize и deserialize, если не используете moment.js.

Ответ 3

Решение Ember-Rails:

Я использую ember-data 0.13/ ember.js 1.0.0.rc5 в приложении ember-rails. Я обнаружил, что должен был сделать следующее, чтобы соответствовать датам 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 для сериализации, но, вероятно, это не будет сложно сделать самостоятельно.

Ответ 4

Версия, которая не полагается на 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;
      }
    }
  });