Есть ли способ отслеживать изменения объекта? - PullRequest
6 голосов
/ 02 июня 2011

Вместо запуска события, основанного на действиях пользователя, можете ли вы просто прослушать изменения объекта и отреагировать затем?

Ответы [ 3 ]

7 голосов
/ 02 июня 2011

Ну, в зависимости от домена, с которым вы работаете, вы можете использовать backbone.js - у него есть «модельный» объект, который вы можете расширять и подключать к обратным вызовам, которые запускаются событиями автоматически когда модель изменяется, то есть вы устанавливаете поле для модели, и оно автоматически запускает событие, которое вы можете прослушивать. Вы должны определить свои модели, чтобы расширить его модель, и вызывать функцию установки вместо прямой установки свойств, но это очень полезно, я рекомендую это.

Ради ясности, событие вызывается из модели при изменении , поэтому оно запускается, даже если вы установили значение атрибута программно или в консоли.

5 голосов
/ 03 июня 2011

Я написал что-то вроде этого.

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);
  };

Это упрощенный пример, поскольку я ввел «связующее ПО для атрибутов» в микс, но это показывает, как вы можете генерировать событие изменения на основе изменения свойства.

0 голосов
/ 02 июня 2011

Вы можете использовать геттеры и сеттеры, которые реагируют на изменение свойств.Джон Резиг написал о них статью .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...