Skip to content

Commit 1eeeb9b

Browse files
committed
support v-on custom events on child component
1 parent 7a63cb0 commit 1eeeb9b

File tree

2 files changed

+40
-7
lines changed

2 files changed

+40
-7
lines changed

src/api/data.js

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,23 @@ var filterRE = /[^|]\|[^|]/
99
* Get the value from an expression on this vm.
1010
*
1111
* @param {String} exp
12+
* @param {Boolean} [asStatement]
1213
* @return {*}
1314
*/
1415

15-
exports.$get = function (exp) {
16+
exports.$get = function (exp, asStatement) {
1617
var res = expParser.parse(exp)
1718
if (res) {
18-
try {
19-
return res.get.call(this, this)
20-
} catch (e) {}
19+
if (asStatement && !expParser.isSimplePath(exp)) {
20+
var self = this
21+
return function statementHandler () {
22+
res.get.call(self, self)
23+
}
24+
} else {
25+
try {
26+
return res.get.call(this, this)
27+
} catch (e) {}
28+
}
2129
}
2230
}
2331

@@ -78,23 +86,24 @@ exports.$watch = function (exp, cb, options) {
7886
* Evaluate a text directive, including filters.
7987
*
8088
* @param {String} text
89+
* @param {Boolean} [asStatement]
8190
* @return {String}
8291
*/
8392

84-
exports.$eval = function (text) {
93+
exports.$eval = function (text, asStatement) {
8594
// check for filters.
8695
if (filterRE.test(text)) {
8796
var dir = dirParser.parse(text)
8897
// the filter regex check might give false positive
8998
// for pipes inside strings, so it's possible that
9099
// we don't get any filters here
91-
var val = this.$get(dir.expression)
100+
var val = this.$get(dir.expression, asStatement)
92101
return dir.filters
93102
? this._applyFilters(val, null, dir.filters)
94103
: val
95104
} else {
96105
// no filter
97-
return this.$get(text)
106+
return this.$get(text, asStatement)
98107
}
99108
}
100109

src/instance/events.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
var _ = require('../util')
22
var inDoc = _.inDoc
3+
var eventRE = /^v-on:|^@/
34

45
/**
56
* Setup the instance's option events & watchers.
@@ -9,10 +10,33 @@ var inDoc = _.inDoc
910

1011
exports._initEvents = function () {
1112
var options = this.$options
13+
if (options._asComponent) {
14+
registerComponentEvents(this, options.el)
15+
}
1216
registerCallbacks(this, '$on', options.events)
1317
registerCallbacks(this, '$watch', options.watch)
1418
}
1519

20+
/**
21+
* Register v-on events on a child component
22+
*
23+
* @param {Vue} vm
24+
* @param {Element} el
25+
*/
26+
27+
function registerComponentEvents (vm, el) {
28+
var attrs = el.attributes
29+
var name, handler
30+
for (var i = 0, l = attrs.length; i < l; i++) {
31+
name = attrs[i].name
32+
if (eventRE.test(name)) {
33+
name = name.replace(eventRE, '')
34+
handler = (vm._scope || vm._context).$eval(attrs[i].value, true)
35+
vm.$on(name.replace(eventRE), handler)
36+
}
37+
}
38+
}
39+
1640
/**
1741
* Register callbacks for option events and watchers.
1842
*

0 commit comments

Comments
 (0)