Parcourir la source

Observer refactor: dep.depend()

Evan You il y a 11 ans
Parent
commit
a94c80b844

+ 2 - 4
src/instance/scope.js

@@ -221,9 +221,7 @@ exports._defineMeta = function (key, value) {
     enumerable: true,
     configurable: true,
     get: function metaGetter () {
-      if (Observer.target) {
-        Observer.target.addDep(dep)
-      }
+      dep.depend()
       return value
     },
     set: function metaSetter (val) {
@@ -233,4 +231,4 @@ exports._defineMeta = function (key, value) {
       }
     }
   })
-}
+}

+ 16 - 1
src/observer/dep.js

@@ -11,6 +11,11 @@ function Dep () {
   this.subs = []
 }
 
+// the current target watcher being evaluated.
+// this is globally unique because there could be only one
+// watcher being evaluated at any time.
+Dep.target = null
+
 var p = Dep.prototype
 
 /**
@@ -33,6 +38,16 @@ p.removeSub = function (sub) {
   this.subs.$remove(sub)
 }
 
+/**
+ * Add self as a dependency to the target watcher.
+ */
+
+p.depend = function () {
+  if (Dep.target) {
+    Dep.target.addDep(this)
+  }
+}
+
 /**
  * Notify all subscribers of a new value.
  */
@@ -45,4 +60,4 @@ p.notify = function () {
   }
 }
 
-module.exports = Dep
+module.exports = Dep

+ 48 - 36
src/observer/index.js

@@ -14,35 +14,6 @@ var uid = 0
 var ARRAY  = 0
 var OBJECT = 1
 
-/**
- * Augment an target Object or Array by intercepting
- * the prototype chain using __proto__
- *
- * @param {Object|Array} target
- * @param {Object} proto
- */
-
-function protoAugment (target, src) {
-  target.__proto__ = src
-}
-
-/**
- * Augment an target Object or Array by defining
- * hidden properties.
- *
- * @param {Object|Array} target
- * @param {Object} proto
- */
-
-function copyAugment (target, src, keys) {
-  var i = keys.length
-  var key
-  while (i--) {
-    key = keys[i]
-    _.define(target, key, src[key])
-  }
-}
-
 /**
  * Observer class that are attached to each observed
  * object. Once attached, the observer converts target
@@ -71,9 +42,7 @@ function Observer (value, type) {
   }
 }
 
-Observer.target = null
-
-var p = Observer.prototype
+// Static methods
 
 /**
  * Attempt to create an observer instance for a value,
@@ -102,6 +71,20 @@ Observer.create = function (value) {
   }
 }
 
+/**
+ * Set the target watcher that is currently being evaluated.
+ *
+ * @param {Watcher} watcher
+ */
+
+Observer.setTarget = function (watcher) {
+  Dep.target = watcher
+}
+
+// Instance methods
+
+var p = Observer.prototype
+
 /**
  * Walk through each property and convert them into
  * getter/setters. This method should only be called when
@@ -168,10 +151,8 @@ p.convert = function (key, val) {
     enumerable: true,
     configurable: true,
     get: function () {
-      // Observer.target is a watcher whose getter is
-      // currently being evaluated.
-      if (ob.active && Observer.target) {
-        Observer.target.addDep(dep)
+      if (ob.active) {
+        dep.depend()
       }
       return val
     },
@@ -231,4 +212,35 @@ p.removeVm = function (vm) {
   this.vms.$remove(vm)
 }
 
+// helpers
+
+/**
+ * Augment an target Object or Array by intercepting
+ * the prototype chain using __proto__
+ *
+ * @param {Object|Array} target
+ * @param {Object} proto
+ */
+
+function protoAugment (target, src) {
+  target.__proto__ = src
+}
+
+/**
+ * Augment an target Object or Array by defining
+ * hidden properties.
+ *
+ * @param {Object|Array} target
+ * @param {Object} proto
+ */
+
+function copyAugment (target, src, keys) {
+  var i = keys.length
+  var key
+  while (i--) {
+    key = keys[i]
+    _.define(target, key, src[key])
+  }
+}
+
 module.exports = Observer

+ 3 - 3
src/watcher.js

@@ -128,7 +128,7 @@ p.set = function (value) {
  */
 
 p.beforeGet = function () {
-  Observer.target = this
+  Observer.setTarget(this)
 }
 
 /**
@@ -136,7 +136,7 @@ p.beforeGet = function () {
  */
 
 p.afterGet = function () {
-  Observer.target = null
+  Observer.setTarget(null)
   var i = this.deps.length
   while (i--) {
     var dep = this.deps[i]
@@ -224,4 +224,4 @@ function traverse (obj) {
   }
 }
 
-module.exports = Watcher
+module.exports = Watcher

+ 5 - 5
test/unit/specs/observer/observer_spec.js

@@ -65,9 +65,9 @@ describe('Observer', function () {
     }
     var dump
     // collect dep
-    Observer.target = watcher
+    Observer.setTarget(watcher)
     dump = obj.a.b
-    Observer.target = null
+    Observer.setTarget(null)
     expect(watcher.deps.length).toBe(2)
     dump = obj.a.b = 3
     expect(watcher.update.calls.count()).toBe(1)
@@ -80,9 +80,9 @@ describe('Observer', function () {
     // recollect dep
     var oldDeps = watcher.deps
     watcher.deps = []
-    Observer.target = watcher
+    Observer.setTarget(watcher)
     dump = obj.a.b
-    Observer.target = null
+    Observer.setTarget(null)
     expect(watcher.deps.length).toBe(2)
     // set on the swapped object
     obj.a.b = 5
@@ -209,4 +209,4 @@ describe('Observer', function () {
     config.proto = true
   })
 
-})
+})