用于jQuery / Javascript的现代KVO库?

时间:2014-03-01 15:32:27

标签: javascript jquery ios objective-c key-value-observing

我想知道jQuery / javascript KVO是否有任何正常运行的库..我在网上找到的所有库(例如this一个)依赖于现已弃用的defineSetter()对象.prototype属性。

2 个答案:

答案 0 :(得分:0)

这是一个非常古老的问题,你可能已经解决了你的问题(或围绕它解决了问题),但对后人我认为这个问题可能很有趣:https://code.google.com/p/mvcobject-js/

它不使用__defineSetter__,而是将属性转换为其他对象。

答案 1 :(得分:0)

const MakeKeyValueObservable = obj => {
  if(Object.keys(obj).length === 0) throw new Error("This design assumes that the passed in object has defined properties already.")
  let observers = {}
  let observable = {
    observe(key, observer){
      if(!observers[key]) observers[key] = []
      observers[key].push(observer)
    },
    stopObserving(observer){
      for(let key in observers){
        let i = 0
        const ubounds = observers[key].length;			
        for(i; i < ubounds; i++){
          if(observers[key][i] === observer){
            observers[key].splice(i, 1)
            if(observers[key].length === 0) delete observers[key]
            break
          }
        }
      }
    },
    changed(key, old, value, me){
      if(!observers[key]) return
      observers[key].forEach( o => {
        o.update(key, old, value, me)
      })
    }
  }

  let keys = Object.keys(obj)
  let ubounds = keys.length
  for(let i = 0; i < ubounds; i++){
    (() => {
      let prop = keys[i]
      Reflect.defineProperty(observable, prop, {
        get(){
          return obj[prop]
        },
        set(v){
          let old = obj[prop]
          obj[prop] = v
          observable.changed(prop, old, v, observable)
        },
        enumerable: true
      })
    })()
  }
  return observable
}

const obj = MakeKeyValueObservable({name: "test"})
const observer = {
  update(key, old, value){
    console.log("being notified of a change:", key, value)
  }
}

obj.observe("name", observer)
obj.name = "something different"