Browse Source

simplify observer self dep

Evan You 10 years ago
parent
commit
17c372672c
4 changed files with 16 additions and 47 deletions
  1. 1 1
      src/observer/array.js
  2. 5 28
      src/observer/index.js
  3. 2 2
      src/observer/object.js
  4. 8 16
      test/unit/specs/observer/observer_spec.js

+ 1 - 1
src/observer/array.js

@@ -42,7 +42,7 @@ var arrayMethods = Object.create(arrayProto)
     }
     if (inserted) ob.observeArray(inserted)
     // notify change
-    ob.notify()
+    ob.dep.notify()
     return result
   })
 })

+ 5 - 28
src/observer/index.js

@@ -18,7 +18,7 @@ require('./object')
 function Observer (value) {
   this.value = value
   this.active = true
-  this.deps = []
+  this.dep = new Dep()
   _.define(value, '__ob__', this)
   if (_.isArray(value)) {
     var augment = config.proto && _.hasProto
@@ -138,9 +138,6 @@ p.convert = function (key, val) {
   var ob = this
   var childOb = ob.observe(val)
   var dep = new Dep()
-  if (childOb) {
-    childOb.deps.push(dep)
-  }
   Object.defineProperty(ob.value, key, {
     enumerable: true,
     configurable: true,
@@ -148,40 +145,20 @@ p.convert = function (key, val) {
       if (ob.active) {
         dep.depend()
       }
+      if (childOb) {
+        childOb.dep.depend()
+      }
       return val
     },
     set: function (newVal) {
       if (newVal === val) return
-      // remove dep from old value
-      var oldChildOb = val && val.__ob__
-      if (oldChildOb) {
-        oldChildOb.deps.$remove(dep)
-      }
       val = newVal
-      // add dep to new value
-      var newChildOb = ob.observe(newVal)
-      if (newChildOb) {
-        newChildOb.deps.push(dep)
-      }
+      childOb = ob.observe(newVal)
       dep.notify()
     }
   })
 }
 
-/**
- * Notify change on all self deps on an observer.
- * This is called when a mutable value mutates. e.g.
- * when an Array's mutating methods are called, or an
- * Object's $add/$delete are called.
- */
-
-p.notify = function () {
-  var deps = this.deps
-  for (var i = 0, l = deps.length; i < l; i++) {
-    deps[i].notify()
-  }
-}
-
 /**
  * Add an owner vm, so that when $add/$delete mutations
  * happen we can notify owner vms to proxy the keys and

+ 2 - 2
src/observer/object.js

@@ -21,7 +21,7 @@ _.define(
       return
     }
     ob.convert(key, val)
-    ob.notify()
+    ob.dep.notify()
     if (ob.vms) {
       var i = ob.vms.length
       while (i--) {
@@ -69,7 +69,7 @@ _.define(
     if (!ob || _.isReserved(key)) {
       return
     }
-    ob.notify()
+    ob.dep.notify()
     if (ob.vms) {
       var i = ob.vms.length
       while (i--) {

+ 8 - 16
test/unit/specs/observer/observer_spec.js

@@ -65,20 +65,18 @@ describe('Observer', function () {
     Observer.setTarget(watcher)
     obj.a.b
     Observer.setTarget(null)
-    expect(watcher.deps.length).toBe(2)
+    expect(watcher.deps.length).toBe(3) // obj.a + a.b + b
     obj.a.b = 3
     expect(watcher.update.calls.count()).toBe(1)
     // swap object
     var oldA = obj.a
     obj.a = { b: 4 }
     expect(watcher.update.calls.count()).toBe(2)
-    expect(oldA.__ob__.deps.length).toBe(0)
-    expect(obj.a.__ob__.deps.length).toBe(1)
     watcher.deps = []
     Observer.setTarget(watcher)
     obj.a.b
     Observer.setTarget(null)
-    expect(watcher.deps.length).toBe(2)
+    expect(watcher.deps.length).toBe(3)
     // set on the swapped object
     obj.a.b = 5
     expect(watcher.update.calls.count()).toBe(3)
@@ -87,8 +85,7 @@ describe('Observer', function () {
   it('observing $add/$set/$delete', function () {
     var obj = { a: 1 }
     var ob = Observer.create(obj)
-    var dep = new Dep()
-    ob.deps.push(dep)
+    var dep = ob.dep
     spyOn(dep, 'notify')
     obj.$add('b', 2)
     expect(obj.b).toBe(2)
@@ -121,8 +118,7 @@ describe('Observer', function () {
   it('observing array mutation', function () {
     var arr = []
     var ob = Observer.create(arr)
-    var dep = new Dep()
-    ob.deps.push(dep)
+    var dep = ob.dep
     spyOn(dep, 'notify')
     var objs = [{}, {}, {}]
     arr.push(objs[0])
@@ -142,8 +138,7 @@ describe('Observer', function () {
   it('array $set', function () {
     var arr = [1]
     var ob = Observer.create(arr)
-    var dep = new Dep()
-    ob.deps.push(dep)
+    var dep = ob.dep
     spyOn(dep, 'notify')
     arr.$set(0, 2)
     expect(arr[0]).toBe(2)
@@ -159,8 +154,7 @@ describe('Observer', function () {
     var obj1 = arr[0]
     var obj2 = arr[1]
     var ob = Observer.create(arr)
-    var dep = new Dep()
-    ob.deps.push(dep)
+    var dep = ob.dep
     spyOn(dep, 'notify')
     // remove by index
     arr.$remove(0)
@@ -185,8 +179,7 @@ describe('Observer', function () {
     var ob = Observer.create(obj)
     expect(obj.$add).toBeTruthy()
     expect(obj.$delete).toBeTruthy()
-    var dep = new Dep()
-    ob.deps.push(dep)
+    var dep = ob.dep
     spyOn(dep, 'notify')
     obj.$add('b', 2)
     expect(dep.notify).toHaveBeenCalled()
@@ -196,8 +189,7 @@ describe('Observer', function () {
     expect(arr.$set).toBeTruthy()
     expect(arr.$remove).toBeTruthy()
     expect(arr.push).not.toBe([].push)
-    var dep2 = new Dep()
-    ob2.deps.push(dep2)
+    var dep2 = ob2.dep
     spyOn(dep2, 'notify')
     arr.push(1)
     expect(dep2.notify).toHaveBeenCalled()