2016-06-17 58 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

好的...看到編輯... –

回答

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

相關問題