Trong javascript cách duy nhất để làm một số xử lý khi nhận được hoặc thiết lập một tài sản đang sử dụng 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
});
Nhưng điều này có một số nhược điểm:
- Không phải là trình duyệt chéo
- Không có ràng buộc, nói cách khác, nếu
firstname
hoặc surname
thay đổi, thuộc tính phụ thuộc fullname
không thay đổi.
- Calling
person.name
khi person
là undefined, làm cho một lỗi được ném
- là không thể thực hiện để kích hoạt các nhà quan sát, không có không có mã bổ sung và nhận thức được những hệ thống phân cấp depency:
firstname
phụ thuộc từ fullname
, và nó có thể phụ thuộc của người khác tài sản arghhh!
Do Ember này có khái niệm "thuộc tính", được gọi là computed property.
Nó có thể được khai báo trong 2 cách sau:
foo: Ember.computed(function({
...
}).property(dependent keys);
hoặc khi sử dụng (mặc định) Ember.ENV.EXTEND_PROTOTYPES = true
:
foo: function() {
...
}.property(dependent keys);
Các property(dependent keys)
, là cần thiết vì nó nói đến Ember gì là properies rằng khi thay đổi, sẽ làm cho tài sản được cập nhật.
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')
Sử dụng này, bạn có lợi thế của:
- khi thay đổi
firstname
hay surname
đến một giá trị mới, fullname
được thay đổi.
- Các
beforeObserves
được kích hoạt trước khi thay đổi giá trị, và observes
được kích hoạt sau khi thay đổi giá trị.
- Bất kỳ mẫu nào tham chiếu đến một số thuộc tính được cập nhật
- Sau đó, một cuộc gọi đến person.get ('firstname'), sẽ trả lại giá trị được lưu trong bộ nhớ cache, lưu chế biến. Bạn có thể tắt tính năng này bằng cách sử dụng
.property(..).volatile()
- Tránh lỗi không xác định hoặc không xác định, khi truy cập các đối tượng rỗng như:
controller.get('person.dog.name')
trả về undefined
, nếu người hoặc chó không xác định.
Tôi hy vọng nó giúp
Nguồn
2013-09-04 14:08:07
http://emberjs.com/guides/object-model/computed-properties/ –
@RUJordan tôi vẫn không hiểu tại sao bạn cần .property() trong mã này 'fullName: function() { trả về this.get ('firstName') + '' + this.get ('lastName'); } .property ('firstName', 'lastName') 'nó vẫn có vẻ dư thừa để có cả một trở lại và một .property() – Wilfred
Cũng trong đoạn mã này' App.SongsController = Ember.ArrayController.extend ({ longSongCount : function() { var longSongs = this.filter (hàm (bài hát) { trả về bài hát.get ('duration')> 30; }); trả về longSongs.get ('length'); } .property ('@ each.duration') }); 'Bạn đã trả về độ dài của longSongs vậy tại sao bạn cần .property ('@ each.duration')? – Wilfred