@@ -4,10 +4,19 @@ import { updateListeners } from 'core/vdom/helpers/update-listeners'
44
55let target : any
66
7+ function createOnceHandler ( event , handler , capture ) {
8+ const _target = target // save current target element in closure
9+ return function onceHandler ( ) {
10+ const res = handler . apply ( null , arguments )
11+ if ( res !== null ) {
12+ remove ( event , onceHandler , capture , _target )
13+ }
14+ }
15+ }
16+
717function add (
818 event : string ,
919 handler : Function ,
10- once : boolean ,
1120 capture : boolean ,
1221 passive ?: boolean ,
1322 params ?: Array < any >
@@ -16,18 +25,6 @@ function add (
1625 console . log ( 'Weex do not support event in bubble phase.' )
1726 return
1827 }
19- if ( once ) {
20- const oldHandler = handler
21- const _target = target // save current target element in closure
22- handler = function ( ev ) {
23- const res = arguments . length === 1
24- ? oldHandler ( ev )
25- : oldHandler . apply ( null , arguments )
26- if ( res !== null ) {
27- remove ( event , null , null , _target )
28- }
29- }
30- }
3128 target . addEvent ( event , handler , params )
3229}
3330
@@ -47,7 +44,7 @@ function updateDOMListeners (oldVnode: VNodeWithData, vnode: VNodeWithData) {
4744 const on = vnode . data . on || { }
4845 const oldOn = oldVnode . data . on || { }
4946 target = vnode . elm
50- updateListeners ( on , oldOn , add , remove , vnode . context )
47+ updateListeners ( on , oldOn , add , remove , createOnceHandler , vnode . context )
5148 target = undefined
5249}
5350
0 commit comments