Explorar el Código

$add/$delete should work on $data too

Evan You hace 11 años
padre
commit
37c7151f67
Se han modificado 4 ficheros con 60 adiciones y 19 borrados
  1. 2 14
      src/api/data.js
  2. 3 2
      src/instance/scope.js
  3. 24 0
      src/observer/index.js
  4. 31 3
      src/observer/object.js

+ 2 - 14
src/api/data.js

@@ -43,13 +43,7 @@ exports.$set = function (exp, val) {
  */
 
 exports.$add = function (key, val) {
-  if (!_.isReserved(key)) {
-    this._data.$add(key, val)
-    this._proxy(key)
-    this._digest()
-  } else {
-    _.warn('Refused to $add reserved key: ' + key)
-  }
+  this._data.$add(key, val)
 }
 
 /**
@@ -59,13 +53,7 @@ exports.$add = function (key, val) {
  */
 
 exports.$delete = function (key) {
-  if (!_.isReserved(key)) {
-    this._data.$delete(key)
-    this._unproxy(key)
-    this._digest()
-  } else {
-    _.warn('Refused to $delete reserved key: ' + key)
-  }
+  this._data.$delete(key)
 }
 
 /**

+ 3 - 2
src/instance/scope.js

@@ -34,7 +34,7 @@ exports._initData = function () {
     }
   }
   // observe data
-  Observer.create(data)
+  Observer.create(data).addVm(this)
 }
 
 /**
@@ -67,7 +67,8 @@ exports._setData = function (newData) {
       this._proxy(key)
     }
   }
-  Observer.create(newData)
+  oldData.__ob__.removeVm(this)
+  Observer.create(newData).addVm(this)
   this._digest()
 }
 

+ 24 - 0
src/observer/index.js

@@ -210,4 +210,28 @@ p.notify = function () {
   }
 }
 
+/**
+ * Add an owner vm, so that when $add/$delete mutations
+ * happen we can notify owner vms to proxy the keys and
+ * digest the watchers. This is only called when the object
+ * is observed as an instance's root $data.
+ *
+ * @param {Vue} vm
+ */
+
+p.addVm = function (vm) {
+  (this.vms = this.vms || []).push(vm)
+}
+
+/**
+ * Remove an owner vm. This is called when the object is
+ * swapped out as an instance's $data object.
+ *
+ * @param {Vue} vm
+ */
+
+p.removeVm = function (vm) {
+  this.vms.splice(this.vms.indexOf(vm), 1)
+}
+
 module.exports = Observer

+ 31 - 3
src/observer/object.js

@@ -14,9 +14,23 @@ _.define(
   objectAgumentations,
   '$add',
   function $add (key, val) {
+    if (_.isReserved(key)) {
+      _.warn('Refused to $add reserved key: ' + key)
+      return
+    }
     if (this.hasOwnProperty(key)) return
-    this.__ob__.convert(key, val)
-    this.__ob__.notify()
+    var ob = this.__ob__
+    ob.convert(key, val)
+    if (ob.vms) {
+      var i = ob.vms.length
+      while (i--) {
+        var vm = ob.vms[i]
+        vm._proxy(key)
+        vm._digest()
+      }
+    } else {
+      ob.notify()
+    }
   }
 )
 
@@ -32,9 +46,23 @@ _.define(
   objectAgumentations,
   '$delete',
   function $delete (key) {
+    if (_.isReserved(key)) {
+      _.warn('Refused to $add reserved key: ' + key)
+      return
+    }
     if (!this.hasOwnProperty(key)) return
     delete this[key]
-    this.__ob__.notify()
+    var ob = this.__ob__
+    if (ob.vms) {
+      var i = ob.vms.length
+      while (i--) {
+        var vm = ob.vms[i]
+        vm._unproxy(key)
+        vm._digest()
+      }
+    } else {
+      ob.notify()
+    }
   }
 )