Как обрабатывать даты в Backbone?
Я храню даты в формате DATETIME в базе данных MySQL. Когда модель извлекается из базы данных, даты (в формате DATETIME) преобразуются в объекты даты в методе инициализации модели. Пока все хорошо.
Когда модель сохраняется на сервере, объекты даты должны быть преобразованы обратно в формат DATETIME, чтобы код на стороне сервера правильно интерпретировал даты. Я использовал всевозможные хакеры для этого, но мне интересно, , на каком этапе может сохранить метод сохранения я могу безопасно преобразовать даты в формат DATETIME?
Один из подходов состоит в том, чтобы сделать следующее:
this.model.save({
date : date.toDateTime()
}, options);
Однако это приводит к тому, что событие изменения запускается с момента хэша атрибутов до того, как метод сохранения не совпадает с хешем после события сохранения (и это вызывает метод установки базовой линии).
Ответы
Ответ 1
Я бы посоветовал использовать UNIX time (количество секунд/миллисекунд с 1970) как в модели, так и в интерфейсе и конвертировать только на читаемую дату в View
.
Таким образом, сервер отправляет и получает даты как цифры, такие как 1328281766454
, и именно так вы храните их в Backbone.Model
. Когда это нужно сделать в View
, вы можете просто вызвать:
new Date(this.model.get('someTime')); //Fri Feb 03 2012 16:09:26 GMT+0100 (CET)
То же самое можно сделать на стороне сервера. Поверьте мне, это самый простой и самый переносимый способ передачи дат без всех этих часовых поясов.
Ответ 2
Я сделал бы это одно из двух мест:
-
На сервере:
Это, вероятно, имеет наибольший смысл, поскольку ваша реализация на стороне сервера действительно та, которая нуждается в представлении DATETIME; ваш код клиента не должен заботиться вообще.
-
В toJSON()
вашей модели:
Если вы должны сделать это на клиенте, переопределите Backbone.Model
toJSON()
для своей модели и обновите ее там. Пример:
toJSON: function () {
var json = Backbone.Model.prototype.toJSON.call(this);
json.date = convertDate(this.get('date'));
return json;
}
Если вы сделаете это, вам нужно будет преобразовать дату назад, либо в вашу модель initialize()
, либо parse()
.
Ответ 3
Не может быть ответа на ваш вопрос - но видели, как люди используют time.js для форматирования времени в магистрали -
http://momentjs.com/