@@ -4,70 +4,85 @@ import contextMap from '../../dynamic/vnode/context'
44
55function logCallbackNotFound ( context , callbackName ) {
66 const location = context . __mpxProxy && context . __mpxProxy . options . mpxFileResource
7- error ( `Instance property [${ callbackName } ] is not function, please check.` , location )
7+ error (
8+ `Instance property [${ callbackName } ] is not function, please check.` ,
9+ location
10+ )
11+ }
12+
13+ function handleEvent ( context , $event , isCapture ) {
14+ if ( typeof Mpx . config . proxyEventHandler === 'function' ) {
15+ try {
16+ Mpx . config . proxyEventHandler ( $event , context )
17+ } catch ( e ) {
18+ }
19+ }
20+ const location = context . __mpxProxy . options . mpxFileResource
21+ const type = $event . type
22+ // thanos 平台特殊事件标识
23+ const emitMode = $event . detail && $event . detail . mpxEmit
24+ if ( ! type ) {
25+ error ( 'Event object must have [type] property!' , location )
26+ return
27+ }
28+ let fallbackType = ''
29+ if ( type === 'begin' || type === 'end' ) {
30+ // 地图的 regionchange 事件会派发 e.type 为 begin 和 end 的事件
31+ fallbackType = __mpx_mode__ === 'ali' ? 'regionChange' : 'regionchange'
32+ } else if ( / - ( [ a - z ] ) / . test ( type ) ) {
33+ fallbackType = dash2hump ( type )
34+ } else if ( __mpx_mode__ === 'ali' ) {
35+ fallbackType = type . replace ( / ^ ./ , i => i . toLowerCase ( ) )
36+ }
37+ const target = $event . currentTarget || $event . target
38+ if ( ! target ) {
39+ error ( `[${ type } ] event object must have [currentTarget/target] property!` , location )
40+ return
41+ }
42+ const mode = isCapture ? 'capture' : 'bubble'
43+ const eventConfigs = target . dataset . eventconfigs ?. [ mode ] || { }
44+
45+ const curEventConfig = eventConfigs [ type ] || eventConfigs [ fallbackType ] || [ ]
46+ // 如果有 mpxuid 说明是运行时组件,那么需要设置对应的上下文
47+ const rootRuntimeContext = contextMap . get ( target . dataset . mpxuid )
48+ const runtimeContext = rootRuntimeContext || context
49+ let returnedValue
50+ curEventConfig . forEach ( ( item ) => {
51+ const callbackName = item [ 0 ]
52+ if ( emitMode ) {
53+ // thanos 平台特殊事件标识处理
54+ $event = $event . detail . data
55+ }
56+ if ( callbackName ) {
57+ const params = item . length > 1
58+ ? item . slice ( 1 ) . map ( item => {
59+ if ( item === '__mpx_event__' ) {
60+ return $event
61+ } else {
62+ return item
63+ }
64+ } )
65+ : [ $event ]
66+ if ( typeof runtimeContext [ callbackName ] === 'function' ) {
67+ returnedValue = runtimeContext [ callbackName ] . apply (
68+ runtimeContext ,
69+ params
70+ )
71+ } else {
72+ logCallbackNotFound ( runtimeContext , callbackName )
73+ }
74+ }
75+ } )
76+ return returnedValue
877}
978
1079export default function proxyEventMixin ( ) {
1180 const methods = {
1281 __invoke ( $event ) {
13- if ( typeof Mpx . config . proxyEventHandler === 'function' ) {
14- try {
15- Mpx . config . proxyEventHandler ( $event , this )
16- } catch ( e ) {
17- }
18- }
19- const location = this . __mpxProxy . options . mpxFileResource
20- const type = $event . type
21- // thanos 平台特殊事件标识
22- const emitMode = $event . detail && $event . detail . mpxEmit
23- if ( ! type ) {
24- error ( 'Event object must have [type] property!' , location )
25- return
26- }
27- let fallbackType = ''
28- if ( type === 'begin' || type === 'end' ) {
29- // 地图的 regionchange 事件会派发 e.type 为 begin 和 end 的事件
30- fallbackType = __mpx_mode__ === 'ali' ? 'regionChange' : 'regionchange'
31- } else if ( / - ( [ a - z ] ) / . test ( type ) ) {
32- fallbackType = dash2hump ( type )
33- } else if ( __mpx_mode__ === 'ali' ) {
34- fallbackType = type . replace ( / ^ ./ , i => i . toLowerCase ( ) )
35- }
36- const target = $event . currentTarget || $event . target
37- if ( ! target ) {
38- error ( `[${ type } ] event object must have [currentTarget/target] property!` , location )
39- return
40- }
41- const eventConfigs = target . dataset . eventconfigs || { }
42- const curEventConfig = eventConfigs [ type ] || eventConfigs [ fallbackType ] || [ ]
43- // 如果有 mpxuid 说明是运行时组件,那么需要设置对应的上下文
44- const rootRuntimeContext = contextMap . get ( target . dataset . mpxuid )
45- const context = rootRuntimeContext || this
46- let returnedValue
47- curEventConfig . forEach ( ( item ) => {
48- const callbackName = item [ 0 ]
49- if ( emitMode ) {
50- // thanos 平台特殊事件标识处理
51- $event = $event . detail . data
52- }
53- if ( callbackName ) {
54- const params = item . length > 1
55- ? item . slice ( 1 ) . map ( item => {
56- if ( item === '__mpx_event__' ) {
57- return $event
58- } else {
59- return item
60- }
61- } )
62- : [ $event ]
63- if ( typeof context [ callbackName ] === 'function' ) {
64- returnedValue = context [ callbackName ] . apply ( context , params )
65- } else {
66- logCallbackNotFound ( context , callbackName )
67- }
68- }
69- } )
70- return returnedValue
82+ return handleEvent ( this , $event , false )
83+ } ,
84+ __captureInvoke ( $event ) {
85+ return handleEvent ( this , $event , true )
7186 } ,
7287 __model ( expr , $event , valuePath = [ 'value' ] , filterMethod ) {
7388 const innerFilter = {
0 commit comments