Просмотр исходного кода

make deep watch traverse arrays

Evan You 11 лет назад
Родитель
Сommit
33dbb5e69d
2 измененных файлов с 13 добавлено и 5 удалено
  1. 5 2
      src/watcher.js
  2. 8 3
      test/unit/specs/watcher_spec.js

+ 5 - 2
src/watcher.js

@@ -225,10 +225,13 @@ p.teardown = function () {
  */
 
 function traverse (obj) {
-  var key, val
+  var key, val, i
   for (key in obj) {
     val = obj[key]
-    if (_.isObject(val)) {
+    if (_.isArray(val)) {
+      i = val.length
+      while (i--) traverse(val[i])
+    } else if (_.isObject(val)) {
       traverse(val)
     }
   }

+ 8 - 3
test/unit/specs/watcher_spec.js

@@ -289,15 +289,20 @@ describe('Watcher', function () {
 
   it('deep watch', function (done) {
     var watcher = new Watcher(vm, 'b', spy, null, false, true)
-    vm.b.c = 3
+    vm.b.c = { d: 4 }
     nextTick(function () {
       expect(spy).toHaveBeenCalledWith(vm.b, vm.b)
       var oldB = vm.b
-      vm.b = { c: 4 }
+      vm.b = { c: [{a:1}] }
       nextTick(function () {
         expect(spy).toHaveBeenCalledWith(vm.b, oldB)
         expect(spy.calls.count()).toBe(2)
-        done()
+        vm.b.c[0].a = 2
+        nextTick(function () {
+          expect(spy).toHaveBeenCalledWith(vm.b, vm.b)
+          expect(spy.calls.count()).toBe(3)
+          done()
+        })
       })
     })
   })