@@ -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