Skip to content

Commit 2859377

Browse files
committed
tests for array linking
1 parent e6851e9 commit 2859377

File tree

3 files changed

+58
-13
lines changed

3 files changed

+58
-13
lines changed

src/observer.js

+11-12
Original file line numberDiff line numberDiff line change
@@ -82,16 +82,16 @@ function watchMutation (method) {
8282
*/
8383
function linkArrayElements (arr, items) {
8484
if (items) {
85-
var i = items.length, item
85+
var i = items.length, item, owners
8686
while (i--) {
8787
item = items[i]
8888
if (isWatchable(item)) {
8989
convert(item)
9090
watch(item)
91-
if (!item.__ownerArrays__) {
92-
def(item, '__ownerArrays__', [])
91+
owners = item.__emitter__.owners
92+
if (owners.indexOf(arr) < 0) {
93+
owners.push(arr)
9394
}
94-
item.__ownerArrays__.push(arr)
9595
}
9696
}
9797
}
@@ -105,8 +105,8 @@ function unlinkArrayElements (arr, items) {
105105
var i = items.length, item
106106
while (i--) {
107107
item = items[i]
108-
if (typeOf(item) === 'Object') {
109-
var owners = item.__ownerArrays__
108+
if (item && item.__emitter__) {
109+
var owners = item.__emitter__.owners
110110
if (owners) owners.splice(owners.indexOf(arr))
111111
}
112112
}
@@ -182,15 +182,14 @@ function convert (obj) {
182182
var emitter = new Emitter()
183183
def(obj, '__emitter__', emitter)
184184
emitter.on('set', function () {
185-
var owners = obj.__ownerArrays__, i
186-
if (owners) {
185+
var owners = obj.__emitter__.owners,
187186
i = owners.length
188-
while (i--) {
189-
owners[i].__emitter__.emit('set', '')
190-
}
187+
while (i--) {
188+
owners[i].__emitter__.emit('set', '', '', true)
191189
}
192190
})
193191
emitter.values = utils.hash()
192+
emitter.owners = []
194193
return true
195194
}
196195

@@ -371,7 +370,7 @@ function observe (obj, rawPath, observer) {
371370
observer.emit('get', path + key)
372371
},
373372
set: function (key, val, propagate) {
374-
observer.emit('set', path + key, val)
373+
if (key) observer.emit('set', path + key, val)
375374
// also notify observer that the object itself changed
376375
// but only do so when it's a immediate property. this
377376
// avoids duplicate event firing.

test/functional/specs/output-object.js

+9-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
casper.test.begin('Outputting Objects', 15, function (test) {
1+
casper.test.begin('Outputting Objects', 17, function (test) {
22

33
casper
44
.start('./fixtures/output-object.html')
@@ -39,6 +39,14 @@ casper.test.begin('Outputting Objects', 15, function (test) {
3939
test.assertSelectorHasText('#data', '{"test":{"hi":3},"arr":[{"a":2},{"a":1}]}')
4040
test.assertSelectorHasText('#arr', '[{"a":2},{"a":1}]')
4141
})
42+
// setting objects inside Array
43+
.thenEvaluate(function () {
44+
test.arr[0].a = 3
45+
})
46+
.then(function () {
47+
test.assertSelectorHasText('#data', '{"test":{"hi":3},"arr":[{"a":3},{"a":1}]}')
48+
test.assertSelectorHasText('#arr', '[{"a":3},{"a":1}]')
49+
})
4250
// swap the array
4351
.thenEvaluate(function () {
4452
test.arr = [1,2,3]

test/unit/specs/observer.js

+38
Original file line numberDiff line numberDiff line change
@@ -363,6 +363,44 @@ describe('UNIT: Observer', function () {
363363

364364
})
365365

366+
describe('Link/Unlink', function () {
367+
368+
var arr = [{a:1}]
369+
Observer.convert(arr)
370+
Observer.watch(arr)
371+
372+
it('should emit empty set when inner objects change', function () {
373+
var emitted = false
374+
arr.__emitter__.on('set', function (key) {
375+
assert.strictEqual(key, '')
376+
emitted = true
377+
})
378+
arr[0].a = 2
379+
assert.ok(emitted)
380+
arr.__emitter__.off()
381+
})
382+
383+
it('should emit for objects added later too', function () {
384+
var emitCount = 0,
385+
a = {c:1}, b = {c:1}, c = {c:1}
386+
arr.__emitter__.on('set', function () {
387+
emitCount++
388+
})
389+
arr.push(a)
390+
arr.unshift(b)
391+
arr.splice(0, 0, c)
392+
a.c = b.c = c.c = 2
393+
assert.strictEqual(emitCount, 3)
394+
})
395+
396+
it('should remove itself from unlinked elements', function () {
397+
var removed = arr.pop(),
398+
index = removed.__emitter__.owners.indexOf(arr)
399+
assert.strictEqual(index, -1)
400+
})
401+
402+
})
403+
366404
})
367405

368406
describe('Multiple observers', function () {

0 commit comments

Comments
 (0)