2017-04-16 20 views
0

我一直在使用Object.observe()作爲nw.js項目的一部分,該項目現在正從nw.js v.0.12.3過渡到最新版本。從Object.observe轉換

我有這樣的代碼:

..(myclass).. 
data: { a:0, b:42 }, 
setupHandlers: function() { 
    Object.observe(this.data, changes => this.draw()); 
}, 
draw: function() { .. } 

我最初的轉換是這樣的:

data: {_a: 0, _b: 42}, 
get a() { return this._a; } 
set a(val) { this.data._a = val; this.draw(); } 
get b() { return this._b; } 
set b(val) { this.data._b = val; this.draw(); } 

,然後更改每一個寫數據(myobj.data.a = 1),而不是寫對象的地方(myobj.a = 1 ),因此使用setter。

這是一個非常勞動密集的轉換,有沒有更簡單的方法?

回答

1

我們結束了使用Proxy趕上屬性賦值:

const shallow_observer = function (obj, fn) { 
    return new Proxy(obj, { 
     set(target, name, val) { 
      target[name] = val; 
      if (fn) fn(target, name, val); 
      return true; 
     } 
    }); 
}; 

這使我們能夠做的事:

data: { a:0, b:42 }, 
setupHandlers: function() { 
    this.data = shallow_observer(this.data, (data, field, value) => this.draw()); 
}, 
draw: function() { .. } 

我們有一個deep_observer功能太(這是更爲複雜),檢測嵌套數據結構的變化,但是shallow_observer對我們所有的用例都是足夠的。