2016-06-17 2 views
1

Можно ли использовать setter/getter для отправки события каждый раз при изменении свойства объекта? Изменил, Я имею в виду участника добавил, удалил или обновил.Использовать setter для отправки события при изменении свойства объекта

Ниже приведен нерабочий пример того, чего я пытаюсь достичь. Каждый раз, когда член добавляется к instance._dataStore, instance должен инициировать событие.

var EventDispatcherObject = require("EventDispatcherObject"); 

var instance = new EventDispatcherObject(); 

//This is a non-working attempt to use setter to dispatch event 
Object.defineProperty(instance, "_dataStore", { 
      get : function() { 
        return this_dataStore; 
      }, 
      set : function(data) { 
        this._dataStore[data] = data; 
        this.dispatchEvent("_dataStoreChanged"); 
      } 
}); 


var data = [{id: "A", data: "abc"}, {id: "B", data: "def"}, {id: "C", data: "ghi"}]; 

for (var i=0; i < data.length; i++) { 
    instance._dataStore[data[i].id] = data[i]; 
} 

//should return: 
console.log(instance._dataStore); 
>>> { 
     A : {id: "A", data: "abc"}, 
     B : {id: "B", data: "def"}, 
     C : {id: "C", data: "ghi"} 
    } 
console.log(instance._dataStore[A]); 
>>> {id: "A", data "abc"} 

На самом деле это нерабочим пример возвращает эту ошибку:

InternalError: too much recursion: return this._dataStore; 
+0

Да, это возможно. Что касается вашего примера не работает (помимо недействительного синтаксиса из-за отсутствия конечной скобки для getter и того факта, что нет такого (встроенного) класса с именем «EventDispatcherObject»)? –

+0

ok ... см. Редактировать ... –

ответ

2

Ваш сеттер определяется для _dataStore собственности, а не для свойств _dataStore собственности. Поэтому он будет активирован только при назначении _dataStore.

Вместо этого вы должны исследовать, используя Proxy; что позволяет подключить к любому сетевому устройству, тогда как обычный сеттер предназначен только для специфических объектов.

this._backingData = {}; 
this._dataStore = new Proxy(this._backingData, { 
    set(target, prop, value, receiver) { 
    target[prop] = value; 
    this.dispatchEvent("_dataStoreChanged");   
    } 
}); 
+0

Хорошо спасибо за совет! –

+0

Кажется, что 'instance._dataStore [prop]' не заполняется в тот момент, когда событие отправлено внутри прокси-сервера, поэтому я не могу получить доступ к его свойствам в функции прослушивателя событий. Это нормально? –

+1

Перед отправкой события убедитесь, что вы установили значение в 'target'. – Jacob

Смежные вопросы