Skip to content

Commit 813ccb4

Browse files
author
RubyLouvre
committed
修正组件dispose
1 parent a45f8e8 commit 813ccb4

12 files changed

+1699
-1122
lines changed

dist/avalon.js

+223-238
Large diffs are not rendered by default.

dist/avalon.modern.js

+250-264
Large diffs are not rendered by default.

dist/avalon.next.js

+250-265
Large diffs are not rendered by default.

dist/avalon.test.js

+260-276
Large diffs are not rendered by default.

karma/component/index.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ describe('测试component模块', function () {
33

44
describe('onComponentDispose', function () {
55
it('contains', function () {
6-
var fn = avalon.onComponentDispose
6+
var fn = avalon._disposeComponent
77
expect(fn).to.be.a('function')
88
var div = document.createElement('div')
99
fn.byMutationEvent(div)

src/avalon.js

-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ require('./vdom/compact')
66
require('./dom/compact')
77
require('./directives/compact')
88
require('./strategy/index')
9-
avalon.onComponentDispose = require('./component/dispose.compact')
109
require('./vmodel/compact')
1110

1211
module.exports = avalon

src/avalon.modern.js

-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,5 @@ require('./dom/modern')
66
require('./directives/modern')
77
require('./strategy/index')
88
require('./vmodel/modern')
9-
avalon.onComponentDispose = require('./component/dispose.compact')
109

1110
module.exports = avalon

src/avalon.next.js

-2
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,5 @@ require('./dom/modern')
66
require('./directives/modern')
77
require('./strategy/index')
88
require('./vmodel/next')
9-
avalon.onComponentDispose = require('./component/dispose.compact')
10-
119

1210
module.exports = avalon

src/component/dispose.compact.js src/component/dispose.js

+63-4
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,66 @@
1-
var ret = require('./dispose.share')
2-
var fireDisposeHook = ret.fireDisposeHook
3-
var fireDisposeHooks = ret.fireDisposeHooks
4-
var fireDisposeHookDelay = ret.fireDisposeHookDelay
1+
function inDomTree(el) {
2+
while (el) {
3+
if (el.nodeType === 9) {
4+
return true
5+
}
6+
el = el.parentNode
7+
}
8+
return false
9+
}
10+
11+
function fireDisposeHook(el) {
12+
if (el.nodeType === 1 && el.getAttribute('wid') && !inDomTree(el)) {
13+
var wid = el.getAttribute('wid')
14+
var docker = avalon.scopes[ wid ]
15+
if (!docker)
16+
return
17+
var vm = docker.vmodel
18+
docker.vmodel.$fire("onDispose", {
19+
type: 'dispose',
20+
target: el,
21+
vmodel: vm
22+
})
23+
if (docker && !el.getAttribute('cached')) {
24+
delete docker.vmodel
25+
delete avalon.scopes[ wid ]
26+
var is = el.getAttribute('is')
27+
var v = el.vtree
28+
detachEvents(v)
29+
if (v) {
30+
v[0][is + '-mount'] = false
31+
v[0]['component-ready:' + is] = false
32+
}
33+
}
34+
return false
35+
}
36+
}
37+
var rtag = /^\w/
38+
function detachEvents(arr) {
39+
for (var i in arr) {
40+
var el = arr[i]
41+
if (rtag.test(el.nodeName)) {
42+
for (var i in el) {
43+
if (i.indexOf('ms-on') === 0) {
44+
delete el[i]
45+
}
46+
}
47+
if (el.children) {
48+
detachEvents(el.children)
49+
}
50+
}
51+
}
52+
}
53+
function fireDisposeHookDelay(a) {
54+
setTimeout(function () {
55+
fireDisposeHook(a)
56+
}, 4)
57+
}
58+
function fireDisposeHooks(nodes) {
59+
for (var i = 0, el; el = nodes[i++]; ) {
60+
fireDisposeHook(el)
61+
}
62+
}
63+
564

665

766
//http://stackoverflow.com/questions/11425209/are-dom-mutation-observers-slower-than-dom-mutation-events

src/component/dispose.share.js

-67
This file was deleted.

src/directives/widget.js

+5-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
var update = require('./_update')
2-
var tryInitComponent = require('../component/init')
2+
var initComponent = require('../component/init')
3+
var disposeComponent = require('../component/dispose')
4+
avalon._disposeComponent = disposeComponent
35

46
avalon.component = function (name, definition) {
57
//这是定义组件的分支,并将列队中的同类型对象移除
@@ -45,7 +47,7 @@ avalon.directive('widget', {
4547
//如果组件没有初始化,那么先初始化(生成对应的vm,$render)
4648
if (!src[vmName]) {
4749
/* istanbul ignore if */
48-
if (!tryInitComponent(src, copy[name], copy.local, copy.template)) {
50+
if (!initComponent(src, copy[name], copy.local, copy.template)) {
4951
//替换成注释节点
5052
src.nodeValue = 'unresolved component placeholder'
5153
copyList[index] = src
@@ -153,7 +155,7 @@ avalon.directive('widget', {
153155

154156
vdom.dom = vm.$element = com
155157
com.vtree = [vdom]
156-
avalon.onComponentDispose(com)
158+
disposeComponent(com)
157159
vdom['component-ready:' + is] = true
158160
//--------------
159161
avalon.scopes[vm.$id] = {

0 commit comments

Comments
 (0)