Ответ 1
Сначала вы должны различать attributes
и instance variables
.
Атрибуты: IMHO, это должны быть простые объекты как String или Integer. Они перемещаются по клиенту и серверу через REST API. Они управляются с помощью Model.get()/Model.set(). Они отправляются на сервер через Model.toJSON() (также они используются для отправки в template
с использованием того же .toJSON()
Если они каким-то образом меняются, то запускаются события базовой линии. Вы можете настроить инициализацию этого attributes
, обрабатывая информацию JSON на стороне сервера, до того, как она будет отправлена в Model, переопределяя Model.parse(), как предположил @muistooshort.
Переменные экземпляра: (объект this.myAttribute
) Они могут быть сложными объектами. Не запускайте какое-либо неявное событие в их изменении, и они не отправляются на сервер в вызовы save
и update
, и стандартным образом они не отправляются в шаблон.
В вашем примере вы не храните какой-либо сложный объект, и если вы не боитесь, что ваша модель отправит на сервер больше атрибутов, чем получает с сервера, вы можете пойти на предложение @muistooshort:
// code no tested
var MyModel = Backbone.Model.extend({
parse: function(resp, xhr) {
resp.startYear = new Date( resp.startTime ).getFullYear();
resp.wholeNumber = Math.Round( resp.numberWithDecimals );
if( resp.fullName == "" ) resp.fullName == null;
return resp;
},
});
Просто помните, что это атрибуты, и вы должны обращаться к ним таким образом my_model.get( "startYear" )
Единственная проблема с этим решением заключается в том, что производные атрибуты не будут обновляться, если исходный атрибут изменится. Итак, вы можете прийти с другой реализацией:
// code no tested
var MyModel = Backbone.Model.extend({
initialize: function(){
this.updateAttributes();
this.on( "change", this.updateAttributes, this );
},
updateAttributes: function() {
this.set( "startYear", new Date( this.get( "startTime" ) ).getFullYear() );
this.set( "wholeNumber", Math.Round( this.get( "numberWithDecimals" ) ) );
if( this.get( "fullName" ) == "" ) this.set( "fullName", null );
},
});
Обновление
Поскольку @TomTu предлагает, чтобы ваши атрибуты onlive были необходимы только для подачи шаблонов, лучшим решением является декоратор: fooobar.com/questions/304921/...