@@ -227,4 +227,42 @@ describe('Options directives', () => {
227
227
} ) . $mount ( )
228
228
expect ( 'Failed to resolve directive: test' ) . toHaveBeenWarned ( )
229
229
} )
230
+
231
+ // #6513
232
+ it ( 'should invoke unbind & inserted on inner component root element change' , done => {
233
+ const dir = {
234
+ bind : jasmine . createSpy ( 'bind' ) ,
235
+ inserted : jasmine . createSpy ( 'inserted' ) ,
236
+ unbind : jasmine . createSpy ( 'unbind' )
237
+ }
238
+
239
+ const Child = {
240
+ template : `<div v-if="ok"/><span v-else/>` ,
241
+ data : ( ) => ( { ok : true } )
242
+ }
243
+
244
+ const vm = new Vue ( {
245
+ template : `<child ref="child" v-test />` ,
246
+ directives : { test : dir } ,
247
+ components : { Child }
248
+ } ) . $mount ( )
249
+
250
+ const oldEl = vm . $el
251
+ expect ( dir . bind . calls . count ( ) ) . toBe ( 1 )
252
+ expect ( dir . bind . calls . argsFor ( 0 ) [ 0 ] ) . toBe ( oldEl )
253
+ expect ( dir . inserted . calls . count ( ) ) . toBe ( 1 )
254
+ expect ( dir . inserted . calls . argsFor ( 0 ) [ 0 ] ) . toBe ( oldEl )
255
+ expect ( dir . unbind ) . not . toHaveBeenCalled ( )
256
+
257
+ vm . $refs . child . ok = false
258
+ waitForUpdate ( ( ) => {
259
+ expect ( vm . $el . tagName ) . toBe ( 'SPAN' )
260
+ expect ( dir . bind . calls . count ( ) ) . toBe ( 2 )
261
+ expect ( dir . bind . calls . argsFor ( 1 ) [ 0 ] ) . toBe ( vm . $el )
262
+ expect ( dir . inserted . calls . count ( ) ) . toBe ( 2 )
263
+ expect ( dir . inserted . calls . argsFor ( 1 ) [ 0 ] ) . toBe ( vm . $el )
264
+ expect ( dir . unbind . calls . count ( ) ) . toBe ( 1 )
265
+ expect ( dir . unbind . calls . argsFor ( 0 ) [ 0 ] ) . toBe ( oldEl )
266
+ } ) . then ( done )
267
+ } )
230
268
} )
0 commit comments