Каков наилучший способ изменить формат даты, когда данные 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
Ответы
Ответ 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;
}
}
});