Я написал что-то вроде этого.
https://github.com/jmoyers/mettle
person.on('name.change', function(val){
// 'a new name was committed: Yolanda'
console.log('a new name was committed: ', val)
});
person.name = 'Yolanda';
https://github.com/jmoyers/mettle/blob/master/src/model.coffee
Это может быть немного много, чтобы копаться во всем источнике. Вот объяснение:
Ключом к моему проекту являются две концепции. Одним из них является отслеживание набора атрибутов и создание методов получения и установки для каждого с использованием defineGetter и defineSetter . Второе - это создание подкласса EventEmitter и трансляция событий на основе этих изменений свойств в вашем установщике.
Трек показывает, как я настраивал геттер / сеттер для набора ключей.
Model.prototype.track = function(keys) {
_.each(keys, __bind(function(key) {
this.tracked.push(key);
this.__defineGetter__(key, __bind(function() {
return this.get(key);
}, this));
return this.__defineSetter__(key, __bind(function(val) {
return this.set(key, val);
}, this));
}, this));
return this;
};
Вот пример того, как вещать на основе «магического» сеттера:
Model.prototype.set = function(key, val) {
this.attribs[key] = val;
this.emit('change', this.attribs);
type = key + '.change';
this.emit(type, val);
};
Это упрощенный пример, поскольку я ввел «связующее ПО для атрибутов» в микс, но это показывает, как вы можете генерировать событие изменения на основе изменения свойства.