Вы можете предоставить свой собственный метод toJSON
в PersonModel:
toJSON: function() {
var attr = Backbone.Model.prototype.toJSON.call(this);
attr.name = this.name();
return attr;
}
Коллекция toJSON просто вызывает toJSON
для каждой модели:
// The JSON representation of a Collection is an array of the
// models' attributes.
toJSON : function() {
return this.map(function(model){ return model.toJSON(); });
},
, поэтому добавление вашей toJSON
к вашей модели должно работать.
Вы также можете добавить name
в качестве реального атрибута, а затем настроить метод validate
вашей модели, чтобы обновить name
, если firstName
или lastName
изменится, и игнорировать любые прямые попытки изменить name
или жаловаться на «попытку изменить атрибут только для чтения», когда кто-то пытается передать name
изменение на set
. Ничто не говорит о том, что validate
не может изменить заданный объект атрибута, поэтому вы можете получить {firstName: 'x'}
и изменить его на {firstName: 'x', name: 'x ' + this.get('lastName')}
до возвращения validate
. Это было бы немного злоупотреблением validate
, но нет явного запрета на validate
изменение набора атрибутов, и это единственный доступный хук, который у вас есть. Я полагаю, вы могли бы заставить модель прослушивать события изменения самостоятельно firstName
и lastName
, а затем вызывать set({name: ...})
, но тогда у вас могут возникнуть проблемы с упорядочением событий, если кто-то другой наблюдает только за именем и фамилией.