فهرست منبع

tests for array linking

Evan You 12 سال پیش
والد
کامیت
2859377f3b
3فایلهای تغییر یافته به همراه58 افزوده شده و 13 حذف شده
  1. 11 12
      src/observer.js
  2. 9 1
      test/functional/specs/output-object.js
  3. 38 0
      test/unit/specs/observer.js

+ 11 - 12
src/observer.js

@@ -82,16 +82,16 @@ function watchMutation (method) {
  */
 function linkArrayElements (arr, items) {
     if (items) {
-        var i = items.length, item
+        var i = items.length, item, owners
         while (i--) {
             item = items[i]
             if (isWatchable(item)) {
                 convert(item)
                 watch(item)
-                if (!item.__ownerArrays__) {
-                    def(item, '__ownerArrays__', [])
+                owners = item.__emitter__.owners
+                if (owners.indexOf(arr) < 0) {
+                    owners.push(arr)
                 }
-                item.__ownerArrays__.push(arr)
             }
         }
     }
@@ -105,8 +105,8 @@ function unlinkArrayElements (arr, items) {
         var i = items.length, item
         while (i--) {
             item = items[i]
-            if (typeOf(item) === 'Object') {
-                var owners = item.__ownerArrays__
+            if (item && item.__emitter__) {
+                var owners = item.__emitter__.owners
                 if (owners) owners.splice(owners.indexOf(arr))
             }
         }
@@ -182,15 +182,14 @@ function convert (obj) {
     var emitter = new Emitter()
     def(obj, '__emitter__', emitter)
     emitter.on('set', function () {
-        var owners = obj.__ownerArrays__, i
-        if (owners) {
+        var owners = obj.__emitter__.owners,
             i = owners.length
-            while (i--) {
-                owners[i].__emitter__.emit('set', '')
-            }
+        while (i--) {
+            owners[i].__emitter__.emit('set', '', '', true)
         }
     })
     emitter.values = utils.hash()
+    emitter.owners = []
     return true
 }
 
@@ -371,7 +370,7 @@ function observe (obj, rawPath, observer) {
             observer.emit('get', path + key)
         },
         set: function (key, val, propagate) {
-            observer.emit('set', path + key, val)
+            if (key) observer.emit('set', path + key, val)
             // also notify observer that the object itself changed
             // but only do so when it's a immediate property. this
             // avoids duplicate event firing.

+ 9 - 1
test/functional/specs/output-object.js

@@ -1,4 +1,4 @@
-casper.test.begin('Outputting Objects', 15, function (test) {
+casper.test.begin('Outputting Objects', 17, function (test) {
     
     casper
     .start('./fixtures/output-object.html')
@@ -39,6 +39,14 @@ casper.test.begin('Outputting Objects', 15, function (test) {
         test.assertSelectorHasText('#data', '{"test":{"hi":3},"arr":[{"a":2},{"a":1}]}')
         test.assertSelectorHasText('#arr', '[{"a":2},{"a":1}]')
     })
+    // setting objects inside Array
+    .thenEvaluate(function () {
+        test.arr[0].a = 3
+    })
+    .then(function () {
+        test.assertSelectorHasText('#data', '{"test":{"hi":3},"arr":[{"a":3},{"a":1}]}')
+        test.assertSelectorHasText('#arr', '[{"a":3},{"a":1}]')
+    })
     // swap the array
     .thenEvaluate(function () {
         test.arr = [1,2,3]

+ 38 - 0
test/unit/specs/observer.js

@@ -363,6 +363,44 @@ describe('UNIT: Observer', function () {
 
         })
 
+        describe('Link/Unlink', function () {
+            
+            var arr = [{a:1}]
+            Observer.convert(arr)
+            Observer.watch(arr)
+
+            it('should emit empty set when inner objects change', function () {
+                var emitted = false
+                arr.__emitter__.on('set', function (key) {
+                    assert.strictEqual(key, '')
+                    emitted = true
+                })
+                arr[0].a = 2
+                assert.ok(emitted)
+                arr.__emitter__.off()
+            })
+
+            it('should emit for objects added later too', function () {
+                var emitCount = 0,
+                    a = {c:1}, b = {c:1}, c = {c:1}
+                arr.__emitter__.on('set', function () {
+                    emitCount++
+                })
+                arr.push(a)
+                arr.unshift(b)
+                arr.splice(0, 0, c)
+                a.c = b.c = c.c = 2
+                assert.strictEqual(emitCount, 3)
+            })
+
+            it('should remove itself from unlinked elements', function () {
+                var removed = arr.pop(),
+                    index = removed.__emitter__.owners.indexOf(arr)
+                assert.strictEqual(index, -1)
+            })
+
+        })
+
     })
 
     describe('Multiple observers', function () {