Skip to content

Commit e498191

Browse files
author
Evan You
committed
also propagate array mutations in observer
1 parent 2248960 commit e498191

File tree

1 file changed

+20
-10
lines changed

1 file changed

+20
-10
lines changed

src/observer.js

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ function watchMutation (method) {
7575
unlinkArrayElements(this, removed)
7676

7777
// emit the mutation event
78-
this.__emitter__.emit('mutate', null, this, {
78+
this.__emitter__.emit('mutate', '', this, {
7979
method : method,
8080
args : args,
8181
result : result,
@@ -167,19 +167,29 @@ function convert (obj) {
167167
if (obj.__emitter__) return true
168168
var emitter = new Emitter()
169169
def(obj, '__emitter__', emitter)
170-
emitter.on('set', function (key, val, propagate) {
171-
if (!propagate) return
172-
var owners = obj.__emitter__.owners,
173-
i = owners.length
174-
while (i--) {
175-
owners[i].__emitter__.emit('set', '', '', true)
176-
}
177-
})
170+
emitter
171+
.on('set', function (key, val, propagate) {
172+
if (propagate) propagateChange(obj)
173+
})
174+
.on('mutate', function () {
175+
propagateChange(obj)
176+
})
178177
emitter.values = utils.hash()
179178
emitter.owners = []
180179
return false
181180
}
182181

182+
/**
183+
* Propagate an array element's change to its owner arrays
184+
*/
185+
function propagateChange (obj) {
186+
var owners = obj.__emitter__.owners,
187+
i = owners.length
188+
while (i--) {
189+
owners[i].__emitter__.emit('set', '', '', true)
190+
}
191+
}
192+
183193
/**
184194
* Watch target based on its type
185195
*/
@@ -266,7 +276,7 @@ function convertKey (obj, key) {
266276
values[key] = val
267277
emitter.emit('set', key, val, propagate)
268278
if (Array.isArray(val)) {
269-
emitter.emit('set', key + '.length', val.length)
279+
emitter.emit('set', key + '.length', val.length, propagate)
270280
}
271281
observe(val, key, emitter)
272282
}

0 commit comments

Comments
 (0)