Skip to content

Commit 6e052c3

Browse files
committed
make fragment.beforeRemove recursive, fix vuejs#2100 properly
1 parent 224151f commit 6e052c3

File tree

1 file changed

+21
-23
lines changed

1 file changed

+21
-23
lines changed

src/fragment/fragment.js

Lines changed: 21 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -64,12 +64,12 @@ export default function Fragment (linker, vm, frag, host, scope, parentFrag) {
6464

6565
Fragment.prototype.callHook = function (hook) {
6666
var i, l
67-
for (i = 0, l = this.children.length; i < l; i++) {
68-
hook(this.children[i])
69-
}
7067
for (i = 0, l = this.childFrags.length; i < l; i++) {
7168
this.childFrags[i].callHook(hook)
7269
}
70+
for (i = 0, l = this.children.length; i < l; i++) {
71+
hook(this.children[i])
72+
}
7373
}
7474

7575
/**
@@ -147,16 +147,28 @@ function multiRemove () {
147147

148148
/**
149149
* Prepare the fragment for removal.
150-
* Most importantly, disable the watchers on all the
151-
* directives so that the rendered content stays the same
152-
* during removal.
153150
*/
154151

155152
Fragment.prototype.beforeRemove = function () {
156-
this.callHook(destroyChild)
153+
var i, l
154+
for (i = 0, l = this.childFrags.length; i < l; i++) {
155+
// call the same method recursively on child
156+
// fragments, depth-first
157+
this.childFrags[i].beforeRemove(false)
158+
}
159+
for (i = 0, l = this.children.length; i < l; i++) {
160+
// Call destroy for all contained instances,
161+
// with remove:false and defer:true.
162+
// Defer is necessary because we need to
163+
// keep the children to call detach hooks
164+
// on them.
165+
this.children[i].$destroy(false, true)
166+
}
157167
var dirs = this.unlink.dirs
158-
var i = dirs.length
159-
while (i--) {
168+
for (i = 0, l = dirs.length; i < l; i++) {
169+
// disable the watchers on all the directives
170+
// so that the rendered content stays the same
171+
// during removal.
160172
dirs[i]._watcher && dirs[i]._watcher.teardown()
161173
}
162174
}
@@ -184,20 +196,6 @@ function attach (child) {
184196
}
185197
}
186198

187-
/**
188-
* Call destroy for all contained instances,
189-
* with remove:false and defer:true.
190-
* Defer is necessary because we need to
191-
* keep the children to call detach hooks
192-
* on them.
193-
*
194-
* @param {Vue} child
195-
*/
196-
197-
function destroyChild (child) {
198-
child.$destroy(false, true)
199-
}
200-
201199
/**
202200
* Call detach hook for a Vue instance.
203201
*

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy