Skip to content

Commit 77ffd53

Browse files
author
Evan You
committed
add tests for object outputing + avoid duplicate events
1 parent f2e32ab commit 77ffd53

File tree

4 files changed

+73
-27
lines changed

4 files changed

+73
-27
lines changed

src/observer.js

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,9 @@ function convert (obj, key) {
159159
unobserve(oldVal, key, observer)
160160
values[key] = newVal
161161
copyPaths(newVal, oldVal)
162-
observer.emit('set', key, newVal)
162+
// an immediate property should notify its parent
163+
// to emit set for itself too
164+
observer.emit('set', key, newVal, true)
163165
observe(newVal, key, observer)
164166
}
165167
})
@@ -264,10 +266,14 @@ function observe (obj, rawPath, observer) {
264266
get: function (key) {
265267
observer.emit('get', path + key)
266268
},
267-
set: function (key, val) {
269+
set: function (key, val, propagate) {
268270
observer.emit('set', path + key, val)
269-
// also notify observer that the object itself chagned
270-
if (rawPath) observer.emit('set', rawPath, obj)
271+
// also notify observer that the object itself changed
272+
// but only do so when it's a immediate property. this
273+
// avoids duplicate event firing.
274+
if (rawPath && propagate) {
275+
observer.emit('set', rawPath, obj, true)
276+
}
271277
},
272278
mutate: function (key, val, mutation) {
273279
// if the Array is a root value
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<div id="test">
2+
<p id="data">{{$data}}</p>
3+
<p id="obj">{{test}}</p>
4+
</div>
5+
6+
<script src="../../../dist/vue.js"></script>
7+
8+
<script>
9+
var test = new Vue({
10+
el: '#test',
11+
data: {
12+
test: {
13+
prop: 1
14+
}
15+
}
16+
})
17+
</script>
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
casper.test.begin('Outputting Objects', 8, function (test) {
2+
3+
casper
4+
.start('./fixtures/output-object.html')
5+
.then(function () {
6+
test.assertSelectorHasText('#data', '{"test":{"prop":1}}')
7+
test.assertSelectorHasText('#obj', '{"prop":1}')
8+
})
9+
// setting a nested property
10+
.thenEvaluate(function () {
11+
test.test.prop = 2
12+
})
13+
.then(function () {
14+
test.assertSelectorHasText('#data', '{"test":{"prop":2}}')
15+
test.assertSelectorHasText('#obj', '{"prop":2}')
16+
})
17+
// setting a nested object
18+
.thenEvaluate(function () {
19+
test.test = { hi:3 }
20+
})
21+
.then(function () {
22+
test.assertSelectorHasText('#data', '{"test":{"hi":3}}')
23+
test.assertSelectorHasText('#obj', '{"hi":3}')
24+
})
25+
// setting $data
26+
.thenEvaluate(function () {
27+
test.$data = { test: { swapped: true } }
28+
})
29+
.then(function () {
30+
test.assertSelectorHasText('#data', '{"test":{"swapped":true}}')
31+
test.assertSelectorHasText('#obj', '{"swapped":true}')
32+
})
33+
.run(function () {
34+
test.done()
35+
})
36+
37+
})

test/unit/specs/observer.js

Lines changed: 9 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -18,19 +18,25 @@ describe('UNIT: Observer', function () {
1818
assert.ok(obj.__observer__.values)
1919
})
2020

21+
var o1 = { a: 1, b: { c: 2 } }
2122
it('should emit set events with correct path', setTestFactory({
22-
obj: { a: 1, b: { c: 2 } },
23+
obj: o1,
2324
expects: [
2425
{ key: 'test.a', val: 1 },
25-
{ key: 'test.b.c', val: 3 }
26+
{ key: 'test', val: o1, skip: true },
27+
{ key: 'test.b.c', val: 3 },
28+
{ key: 'test.b', val: o1.b, skip: true },
29+
{ key: 'test', val: o1, skip: true }
2630
],
2731
path: 'test'
2832
}))
2933

34+
var o2 = { a: 1, b: { c: 2 } }
3035
it('should emit multiple events when a nested object is set', setTestFactory({
31-
obj: { a: 1, b: { c: 2 } },
36+
obj: o2,
3237
expects: [
3338
{ key: 'test.b', val: { c: 3 } },
39+
{ key: 'test', val: o2, skip: true },
3440
{ key: 'test.b.c', val: 3, skip: true }
3541
],
3642
path: 'test'
@@ -433,26 +439,6 @@ describe('UNIT: Observer', function () {
433439

434440
})
435441

436-
// describe('.copyPaths()', function () {
437-
438-
// it('should ensure path for all paths that start with the given key', function () {
439-
// var key = 'a',
440-
// obj = {},
441-
// paths = {
442-
// 'a.b.c': 1,
443-
// 'a.d': 2,
444-
// 'e.f': 3,
445-
// 'g': 4
446-
// }
447-
// Observer.ensurePaths(key, obj, paths)
448-
// assert.strictEqual(obj.b.c, undefined)
449-
// assert.strictEqual(obj.d, undefined)
450-
// assert.notOk('f' in obj)
451-
// assert.strictEqual(Object.keys(obj).length, 2)
452-
// })
453-
454-
// })
455-
456442
function setTestFactory (opts) {
457443
return function () {
458444
var ob = new Emitter(),

0 commit comments

Comments
 (0)