Skip to content
This repository was archived by the owner on Dec 1, 2023. It is now read-only.

Commit eab9c31

Browse files
author
Steffan
committed
add Event class
1 parent 2cb94cc commit eab9c31

File tree

8 files changed

+1305
-313
lines changed

8 files changed

+1305
-313
lines changed

README.md

+3-3
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,13 @@ new Vue({
3737
events: {
3838

3939
// event handler (priority 0)
40-
someEvent(param) { ... },
40+
someEvent(event, param) { ... },
4141

4242
// event handler (priority 10)
4343
earlyEvent: {
4444

4545
// handler callback
46-
handler(param) { ... },
46+
handler(event, param) { ... },
4747

4848
// a higher priority, means earlier execution
4949
priority: 10
@@ -54,7 +54,7 @@ new Vue({
5454
lateEvent: {
5555

5656
// handler callback
57-
handler(param) { ... },
57+
handler(event, param) { ... },
5858

5959
// a lower priority, means late execution
6060
priority: -10

build/build.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ rollup.rollup({
3232
bundle.generate({
3333
format: 'es',
3434
banner: banner
35-
}).then(({code}) => write('dist/vue-event-manager.es2015.js', code, bundle))
35+
}).then(({code}) => write('dist/vue-event-manager.esm.js', code, bundle))
3636
)
3737
.then(bundle =>
3838
bundle.generate({

package.json

+7-6
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "vue-event-manager",
33
"version": "1.0.6",
44
"main": "dist/vue-event-manager.common.js",
5-
"module": "dist/vue-event-manager.es2015.js",
5+
"module": "dist/vue-event-manager.esm.js",
66
"unpkg": "dist/vue-event-manager.min.js",
77
"jsdelivr": "dist/vue-event-manager.min.js",
88
"description": "The event manager for Vue.js",
@@ -24,24 +24,25 @@
2424
"karma": "karma start test/karma.conf.js --single-run",
2525
"build": "node ./build/build.js",
2626
"release": "node ./build/release.js",
27+
"webpack": "webpack",
2728
"eslint": "eslint .",
2829
"eslint-fix": "eslint . --fix"
2930
},
3031
"devDependencies": {
31-
"buble": "^0.18.0",
32+
"buble": "^0.19.3",
3233
"buble-loader": "^0.4.1",
3334
"eslint": "^4.13.1",
34-
"jasmine": "^2.8.0",
35-
"jasmine-core": "^2.8.0",
35+
"jasmine": "^3.1.0",
36+
"jasmine-core": "^3.1.0",
3637
"karma": "^2.0.0",
3738
"karma-chrome-launcher": "^2.2.0",
3839
"karma-firefox-launcher": "^1.1.0",
3940
"karma-jasmine": "^1.1.1",
4041
"karma-safari-launcher": "^1.0.0",
4142
"karma-webpack": "^2.0.9",
4243
"replace-in-file": "^3.1.0",
43-
"rollup": "^0.55.3",
44-
"rollup-plugin-buble": "^0.18.0",
44+
"rollup": "^0.57.0",
45+
"rollup-plugin-buble": "^0.19.2",
4546
"uglify-js": "^3.3.9",
4647
"vue": "^2.5.13",
4748
"webpack": "^3.10.0"

src/EventManager.js

+42-16
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
* Event manager class.
33
*/
44

5-
import {isArray} from './util';
5+
import {isArray, isUndefined} from './util';
66

77
export default class EventManager {
88

@@ -44,34 +44,60 @@ export default class EventManager {
4444
}
4545
}
4646

47-
trigger(event, params = [], asynch = false) {
47+
trigger(event, params, asynch = false) {
4848

49-
if (!isArray(params)) {
50-
params = [params];
51-
}
49+
const $event = new Event(event, params);
50+
const reject = result => Promise.reject(result);
51+
const resolve = result => !isUndefined(result) ? result : $event.result;
52+
const reducer = (result, {callback}) => {
5253

53-
return ((this.listeners[event] || []).concat()).reduce((result, listener) => {
54+
const next = result => {
5455

55-
const callback = result => {
56+
if (!isUndefined(result)) {
57+
$event.result = result;
58+
}
5659

5760
if (result === false) {
58-
return result;
61+
$event.stopPropagation();
5962
}
6063

61-
if (isArray(result)) {
62-
params = result;
64+
if ($event.isPropagationStopped()) {
65+
return $event.result;
6366
}
6467

65-
return listener.callback.apply(listener.callback, params);
68+
return callback.apply(callback, [$event].concat($event.params));
6669
};
6770

68-
if (asynch) {
69-
return result.then(callback);
70-
}
71+
return asynch ? result.then(next, reject) : next(result);
72+
};
73+
74+
const listeners = (this.listeners[event] || []).concat();
75+
const result = listeners.reduce(reducer, asynch ? Promise.resolve() : undefined);
76+
77+
return asynch ? result.then(resolve, reject) : resolve(result);
78+
}
79+
80+
}
7181

72-
return callback(result);
82+
export class Event {
83+
84+
constructor(name, params = []) {
85+
86+
if (!isArray(params)) {
87+
params = [params];
88+
}
89+
90+
this.name = name;
91+
this.params = params;
92+
this.result = undefined;
93+
}
94+
95+
stopPropagation() {
96+
this.stop = true;
97+
}
7398

74-
}, asynch ? Promise.resolve() : undefined);
99+
isPropagationStopped() {
100+
return this.stop === true;
75101
}
76102

77103
}

src/util.js

+4
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@ export function isObject(obj) {
88
return obj !== null && typeof obj === 'object';
99
}
1010

11+
export function isUndefined(obj) {
12+
return typeof obj === 'undefined';
13+
}
14+
1115
export function forEach(collection, callback) {
1216
Object.keys(collection || {}).forEach(key => {
1317
callback.call(null, collection[key], key);

test/event.js

+10-9
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,9 @@ describe('Vue.events', () => {
88
this.$trigger('someEvent', 'foo');
99
},
1010
events: {
11-
someEvent(param) {
11+
someEvent(event, param) {
1212
expect(param).toBe('foo');
13+
expect(event.name).toBe('someEvent');
1314
}
1415
}
1516
});
@@ -21,7 +22,7 @@ describe('Vue.events', () => {
2122
this.$trigger('paramArray', ['foo', 'bar']);
2223
},
2324
events: {
24-
paramArray(param, param2) {
25+
paramArray(event, param, param2) {
2526
expect(param).toBe('foo');
2627
expect(param2).toBe('bar');
2728
}
@@ -35,7 +36,7 @@ describe('Vue.events', () => {
3536
this.$trigger('paramObject', { foo : 'bar' });
3637
},
3738
events: {
38-
paramObject(param) {
39+
paramObject(event, param) {
3940
expect(param.foo).toBe('bar');
4041
}
4142
}
@@ -54,15 +55,15 @@ describe('Vue.events', () => {
5455
prioHandler: [
5556
{
5657
// handler callback
57-
handler(param) {
58+
handler(event, param) {
5859
this.lastPrio = 10;
5960
},
6061
// a higher priority, means earlier execution
6162
priority: 10
6263
},
6364
{
6465
// handler callback
65-
handler(param) {
66+
handler(event, param) {
6667
expect(this.lastPrio).toBe(10);
6768
this.lastPrio = -10;
6869
},
@@ -85,7 +86,7 @@ describe('Vue.events', () => {
8586
}
8687
},
8788
events: {
88-
testEvent(param) {
89+
testEvent(event, param) {
8990
this.isLoaded = true;
9091
expect(this.isLoaded).toBe(true);
9192
}
@@ -95,7 +96,7 @@ describe('Vue.events', () => {
9596
var vm2 = new Vue({
9697
events: {
9798
testEvent:{
98-
handler(param) {
99+
handler(event, param) {
99100
expect(param).toBe('foo');
100101
},
101102
priority: 10
@@ -114,7 +115,7 @@ describe('Vue.events', () => {
114115
}
115116
},
116117
events: {
117-
actionCancel(param) {
118+
actionCancel(event, param) {
118119
this.isLoaded = true;
119120
return "lastAction";
120121
}
@@ -124,7 +125,7 @@ describe('Vue.events', () => {
124125
var vm2 = new Vue({
125126
events: {
126127
actionCancel:{
127-
handler(param) {
128+
handler(event, param) {
128129
expect(param).toBe('foo');
129130
return false;
130131
},

test/eventAsync.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ describe('Vue.events Async', () => {
1717
this.isRun = true;
1818
expect(this.isRun).toBe(true);
1919
},
20-
sendParam(param) {
20+
sendParam(event, param) {
2121
expect(this.isRun).toBe(false);
2222
}
2323
}
@@ -33,7 +33,7 @@ describe('Vue.events Async', () => {
3333
}
3434
},
3535
events: {
36-
testEvent(param) {
36+
testEvent(event, param) {
3737
this.isLoaded = true;
3838
expect(this.isLoaded).toBe(true);
3939
done();
@@ -44,7 +44,7 @@ describe('Vue.events Async', () => {
4444
var vm2 = new Vue({
4545
events: {
4646
testEvent:{
47-
handler(param) {
47+
handler(event, param) {
4848
expect(param).toBe('foo');
4949
return new Promise((resolve) => {
5050
setTimeout(resolve, 300);

0 commit comments

Comments
 (0)