В JavaScript единственный способ сделать некоторую обработку при получении или установки одно свойство используется Object.defineProperty:
Object.defineProperty(person, "b", {
get : function() {
return person.firstName + ' ' + person.surname;
},
set : function(newValue) {
var names = newValue.split(' ');
person.firsname = names[0];
person.surname = names[1];
},
enumerable : true,
configurable : true
});
Но есть некоторые недостатки:
- Не кросс-браузер
- Другими словами, не имеет привязки, если изменения
firstname
или surname
, зависимое свойство fullname
не изменяется.
- Вызов
person.name
когда person
неопределен, сделать ошибку будет сгенерировано
- не представляется возможным вызвать наблюдателей, ни без дополнительного кода и осознает depency иерархия:
firstname
зависит от fullname
, и это может быть зависимость от других свойства arghhh!
Из-за этого Ember имеет концепцию «собственность», называемую computed property.
Он может быть объявлен 2-мя способами:
foo: Ember.computed(function({
...
}).property(dependent keys);
или при использовании (по умолчанию) Ember.ENV.EXTEND_PROTOTYPES = true
:
foo: function() {
...
}.property(dependent keys);
property(dependent keys)
, необходима, потому что сказать Ember, что это Недвижимость Болгария Недвижимость что при изменении изменится свойство.
fullname: function(key, value) {
// setter
if (value !== undefined) {
var names = value.split(' ');
this.set('firstname', names[0]);
this.set('surname', names[1]);
}
// always return the complete result, so nexts calls to this.get('fullname') will return the cached value
return this.get('firstname') + ' ' + this.get('surname');
}.property('firstname', 'surname')
Используя это, у вас есть преимущество:
- при изменении
firstname
или surname
на новое значение, fullname
изменяется.
- Перед изменением значения запускаются
beforeObserves
, а после изменения значения запускаются observes
.
- Обновлен любой шаблон, ссылающийся на некоторое свойство
- Более одного вызова person.get ('firstname') вернет кешированное значение, сохранив обработку. Вы можете отключить его, используя
.property(..).volatile()
- Избегайте использования null или undefined ошибок при обращении к нулевым объектам, таким как:
controller.get('person.dog.name')
возвращает undefined
, если человек или собака не определены.
Я надеюсь, что это помогает
http://emberjs.com/guides/object-model/computed-properties/ –
@RUJordan Я до сих пор не понимаю, почему вам нужно .Property Свойство() в этом коде 'fullName: function() { return this.get ('firstName') + '' + this.get ('lastName'); } .property ('firstName', 'lastName') 'все еще кажется лишним иметь как возврат, так и .property() – Wilfred
Также в этом фрагменте кода' App.SongsController = Ember.ArrayController.extend ({longSongCount : function() { var longSongs = this.filter (функция (песня) { возвращение song.get ('duration')> 30; }); возвращение longSongs.get ('length'); } .property ('@ each.duration') }); 'Вы уже возвращаете длину longSongs, так зачем вам нужно .property ('@ each.duration')? – Wilfred