This repository has been archived on 2023-08-30. You can view files and clone it, but cannot push or open issues/pull-requests.
bytedo
/
anot
Archived
1
0
Fork 0
anot/src/directives/on.js

55 lines
1.4 KiB
JavaScript

import { Anot } from '../seed/core'
import { addScope, makeHandle } from '../parser/index'
Anot.directive('on', {
beforeInit: function() {
this.getter = Anot.noop
},
init: function() {
var vdom = this.node
var underline = this.name.replace('ms-on-', 'e').replace('-', '_')
var uuid =
underline +
'_' +
this.expr.replace(/\s/g, '').replace(/[^$a-z]/gi, function(e) {
return e.charCodeAt(0)
})
var fn = Anot.eventListeners[uuid]
if (!fn) {
var arr = addScope(this.expr)
var body = arr[0],
filters = arr[1]
body = makeHandle(body)
if (filters) {
filters = filters.replace(/__value__/g, '$event')
filters += '\nif($event.$return){\n\treturn;\n}'
}
var ret = [
'try{',
'\tvar __vmodel__ = this;',
'\t' + filters,
'\treturn ' + body,
'}catch(e){console.log(e, "in on dir")}'
].filter(function(el) {
return /\S/.test(el)
})
fn = new Function('$event', ret.join('\n'))
fn.uuid = uuid
Anot.eventListeners[uuid] = fn
}
var dom = Anot.vdom(vdom, 'toDOM')
dom._ms_context_ = this.vm
this.eventType = this.param.replace(/\-(\d)$/, '')
delete this.param
Anot(dom).bind(this.eventType, fn)
},
beforeDispose: function() {
Anot(this.node.dom).unbind(this.eventType)
}
})
前端迷你mvvm框架。基于司徒正美的`avalon2.x`版精简修改而来。
JavaScript 100%