Skip to content

Commit

Permalink
fix(g-base): event object of event delegation and propagation is inco…
Browse files Browse the repository at this point in the history
…rrect, close #249
  • Loading branch information
dengfuping committed Nov 11, 2019
1 parent 859da22 commit 8b01001
Show file tree
Hide file tree
Showing 5 changed files with 160 additions and 15 deletions.
6 changes: 0 additions & 6 deletions packages/g-base/src/abstract/base.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,6 @@ abstract class Base extends EE implements IBase {
* @type {object}
*/
cfg: object;
/**
* @private
* 事件集合
* @type {object}
*/
events: object = {};

/**
* 是否被销毁
Expand Down
14 changes: 7 additions & 7 deletions packages/g-base/src/event/event-contoller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -90,13 +90,12 @@ function emitDelegation(container, type, eventObj) {
const element = paths[i];
// 暂定跟 name 绑定
const name = element.get('name');
if (name) {
const eventName = name + DELEGATION_SPLIT + type;
if (events[eventName]) {
eventObj.delegateTarget = container;
eventObj.currentTarget = element;
container.emit(eventName, eventObj);
}
const eventName = name ? name + DELEGATION_SPLIT + type : '*';
if (events[eventName]) {
eventObj.name = eventName;
eventObj.delegateTarget = container;
eventObj.currentTarget = element;
container.emit(eventName, eventObj);
}
}
}
Expand All @@ -123,6 +122,7 @@ function bubbleEvent(container, type, eventObj) {
eventObj.bubbles = false;
return;
}

// 绑定事件的对象
eventObj.currentTarget = container;
container.emit(type, eventObj);
Expand Down
11 changes: 11 additions & 0 deletions packages/g-base/src/event/graph-event.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,11 @@ class GraphEvent {
* @type {string}
*/
type: string;
/**
* 事件名称
* @type {string}
*/
name: string;
/**
* 画布上的位置 x
* @type {number}
Expand Down Expand Up @@ -41,6 +46,11 @@ class GraphEvent {
* @type {object}
*/
currentTarget: object = null;
/**
* 代理对象
* @type {object}
*/
delegateTarget: object = null;
/**
* 是否阻止了原生事件
* @type {boolean}
Expand Down Expand Up @@ -84,6 +94,7 @@ class GraphEvent {

constructor(type, event) {
this.type = type;
this.name = type;
this.domEvent = event;
this.timeStamp = event.timeStamp;
}
Expand Down
4 changes: 2 additions & 2 deletions packages/g-base/tests/unit/event-spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ describe('test event object', () => {
expect(event.defaultPrevented).eql(true);
});

it('stopProgation', () => {
it('stopPropagation', () => {
event.stopPropagation();
expect(event.propagationStopped).eql(true);
});
Expand Down Expand Up @@ -829,7 +829,7 @@ describe('test graphic events', () => {
group1.set('name', null);
});

it('stopProgation', () => {
it('stopPropagation', () => {
let group1Called = false;
let group11Called = false;
let canvasCalled = false;
Expand Down
140 changes: 140 additions & 0 deletions packages/g-canvas/tests/bugs/issue-249-spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,140 @@
const expect = require('chai').expect;
import Canvas from '../../src/canvas';
import { simulateMouseEvent, getClientPoint } from '../util';

const dom = document.createElement('div');
document.body.appendChild(dom);
dom.id = 'c1';

describe('#249', () => {
const canvas = new Canvas({
container: dom,
width: 600,
height: 600,
});

const el = canvas.get('el');

// it.only('*', () => {
// const group = canvas.addGroup({
// name: 'group',
// });
// const circle = group.addShape('circle', {
// name: 'circle',
// attrs: {
// x: 50,
// y: 50,
// r: 50,
// fill: 'red',
// },
// });

// const { clientX, clientY } = getClientPoint(canvas, 50, 50);
// let flag = false;
// let ev2;

// canvas.on('*', (e) => {
// flag = true;
// });

// group.on('circle:click', (e) => {
// ev2 = e;
// });

// simulateMouseEvent(el, 'mousedown', {
// clientX,
// clientY,
// });

// simulateMouseEvent(el, 'mouseup', {
// clientX,
// clientY,
// });
// expect(flag).eqls(true);
// });

it('eventObj of event delegation should be independent', () => {
const group = canvas.addGroup({
name: 'group',
});
const circle = group.addShape('circle', {
name: 'circle',
attrs: {
x: 50,
y: 50,
r: 50,
fill: 'red',
},
});

const { clientX, clientY } = getClientPoint(canvas, 50, 50);
let ev1;
let ev2;

canvas.on('group:click', (e) => {
ev1 = e;
});

group.on('circle:click', (e) => {
ev2 = e;
});

simulateMouseEvent(el, 'mousedown', {
clientX,
clientY,
});

simulateMouseEvent(el, 'mouseup', {
clientX,
clientY,
});
expect(ev1.target).eqls(circle);
expect(ev1.currentTarget).eqls(group);
expect(ev1.delegateTarget).eqls(canvas);
expect(ev2.target).eqls(circle);
expect(ev2.currentTarget).eqls(circle);
expect(ev2.delegateTarget).eqls(group);
});

it('eventObj of event propagation should be independent', () => {
const group = canvas.addGroup({
name: 'group',
});
const circle = group.addShape('circle', {
name: 'circle',
attrs: {
x: 50,
y: 50,
r: 50,
fill: 'red',
},
});

const { clientX, clientY } = getClientPoint(canvas, 50, 50);
let ev1;
let ev2;

canvas.on('click', (e) => {
ev1 = e;
});

group.on('click', (e) => {
ev2 = e;
});

simulateMouseEvent(el, 'mousedown', {
clientX,
clientY,
});

simulateMouseEvent(el, 'mouseup', {
clientX,
clientY,
});

expect(ev1.target).eqls(circle);
expect(ev1.currentTarget).eqls(canvas);
expect(ev2.target).eqls(circle);
expect(ev2.currentTarget).eqls(group);
});
});

0 comments on commit 8b01001

Please sign in to comment.