Skip to content

Commit 1649ef2

Browse files
author
regou
committed
custom event support
1 parent 22a4372 commit 1649ef2

File tree

4 files changed

+44
-24
lines changed

4 files changed

+44
-24
lines changed

example/counter-simple.html

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,31 @@
66
<div>{{ count }}</div>
77
<button v-stream:click="plus$">+</button>
88
<button v-stream:click="minus$">-</button>
9+
<my-component v-stream:more="more$"></my-component>
910
</div>
1011

1112
<script>
13+
Vue.component('my-component', {
14+
template: '<button v-on:click="more">Iwant more!</button>',
15+
methods:{
16+
more:function(){
17+
this.$emit('more',100)
18+
}
19+
}
20+
})
21+
1222
new Vue({
1323
el: '#app',
1424

1525
// declare dom stream Subjects
16-
domStreams: ['plus$', 'minus$'],
26+
domStreams: ['plus$', 'minus$','more$'],
1727

1828
subscriptions () {
1929
var plus$ = this.plus$.map(() => 1)
2030
var minus$ = this.minus$.map(() => -1)
31+
var more$ = this.more$.map(() => 100)
2132
var count$ = Rx.Observable
22-
.merge(plus$, minus$)
33+
.merge(plus$, minus$, more$)
2334
.startWith(0)
2435
.scan((total, change) => total + change)
2536

@@ -28,4 +39,4 @@
2839
}
2940
}
3041
})
31-
</script>
42+
</script>

src/directives/stream.js

Lines changed: 28 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,6 @@ export default {
1111
const event = binding.arg
1212
const streamName = binding.expression
1313

14-
if (!Rx.Observable.fromEvent) {
15-
warn(
16-
`No 'fromEvent' method on Observable class. ` +
17-
`v-stream directive requires Rx.Observable.fromEvent method. ` +
18-
`Try import 'rxjs/add/observable/fromEvent' for ${streamName}`,
19-
vnode.context
20-
)
21-
return
22-
}
2314
if (isSubject(handle)) {
2415
handle = { subject: handle }
2516
} else if (!handle || !isSubject(handle.subject)) {
@@ -34,17 +25,36 @@ export default {
3425

3526
const subject = handle.subject
3627
const next = (subject.next || subject.onNext).bind(subject)
37-
let fromEventArgs = handle.options ? [el, event, handle.options] : [el, event]
38-
handle.subscription = Rx.Observable.fromEvent(...fromEventArgs).subscribe(e => {
39-
next({
40-
event: e,
41-
data: handle.data
28+
29+
if (vnode.componentInstance) {
30+
handle.subscription = vnode.componentInstance.$eventToObservable(event).subscribe(e => {
31+
next({
32+
event: e,
33+
data: handle.data
34+
})
35+
})
36+
} else {
37+
if (!Rx.Observable.fromEvent) {
38+
warn(
39+
`No 'fromEvent' method on Observable class. ` +
40+
`v-stream directive requires Rx.Observable.fromEvent method. ` +
41+
`Try import 'rxjs/add/observable/fromEvent' for ${streamName}`,
42+
vnode.context
43+
)
44+
return
45+
}
46+
let fromEventArgs = handle.options ? [el, event, handle.options] : [el, event]
47+
handle.subscription = Rx.Observable.fromEvent(...fromEventArgs).subscribe(e => {
48+
next({
49+
event: e,
50+
data: handle.data
51+
})
4252
})
43-
})
4453

45-
// store handle on element with a unique key for identifying
46-
// multiple v-stream directives on the same node
47-
;(el._rxHandles || (el._rxHandles = {}))[getKey(binding)] = handle
54+
// store handle on element with a unique key for identifying
55+
// multiple v-stream directives on the same node
56+
;(el._rxHandles || (el._rxHandles = {}))[getKey(binding)] = handle
57+
}
4858
},
4959

5060
update (el, binding) {

src/methods/eventToObservable.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,13 @@ export default function eventToObservable (evtName) {
1212
const vm = this
1313
let evtNames = Array.isArray(evtName) ? evtName : [evtName]
1414
const obs$ = Rx.Observable.create(observer => {
15-
let eventPairs = evtNames.map(name =>{
15+
let eventPairs = evtNames.map(name => {
1616
let callback = msg => observer.next({name, msg})
1717
vm.$on(name, callback)
1818
return {name, callback}
1919
})
2020
return () => {
21-
//Only remove the specific callback
21+
// Only remove the specific callback
2222
eventPairs.forEach(pair => vm.$off(pair.name, pair.callback))
2323
}
2424
})

test/test.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -315,7 +315,6 @@ test('$eventToObservable() with lifecycle hooks', done => {
315315
created(){
316316
this.$eventToObservable('hook:beforeDestroy')
317317
.subscribe(function (event) {
318-
console.log(event);
319318
done(event)
320319
});
321320
}

0 commit comments

Comments
 (0)