xieziyu / ngx-echarts

An angular (ver >= 2.x) directive for ECharts (ver >= 3.x)
https://xieziyu.github.io/ngx-echarts/
MIT License
1.1k stars 195 forks source link

鼠标进入时setOption后鼠标离开事件不执行 #101

Open jsvr opened 6 years ago

jsvr commented 6 years ago

_20180601152720 _20180601152726 鼠标放在地图上时,判断鼠标放入的国家后,然后setOption配置地图,鼠标离开当前的国家时,chartMouseOut事件无法执行.急求,在线等, 急急急急急急!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! @xieziyu

xieziyu commented 6 years ago

@jsvr 你的这个场景下,原生的echarts是否有mouseout事件产生?你可以在echarts官网示例里面调试一下。

jsvr commented 6 years ago

@xieziyu 我刚才试了下, 原生的在官网里试是没有问题的,完全ok

xieziyu commented 6 years ago

@jsvr setOptMap里面有做什么操作吗?

jsvr commented 6 years ago

@xieziyu 就是把一些国家的默认选中了

jsvr commented 6 years ago

把一些国家默认选中

xieziyu commented 6 years ago

@jsvr 如果没有重置图表,事件侦听器应该不会失效的。 能否用我的stackblitz建一个模拟你问题现场的环境: https://stackblitz.com/edit/angular-dcoe1h 这将有助于复现问题和我这边进行调查

jsvr commented 6 years ago

刚才测试,发现一个问题, 就是鼠标进入的时候不setOption,鼠标离开时执行setOption, 鼠标再次进入时,进入事件是响应的.

jsvr commented 6 years ago

我执行的setOption 相当于就是从新重置图表吧 @xieziyu

xieziyu commented 6 years ago

@jsvr setOption不会的

jsvr commented 6 years ago

稍等一下, 我去你给我的链接上复现一下问题

jsvr commented 6 years ago

是这样的,能不能留一个你的联系方式, 我把项目发给你吧 @xieziyu

jsvr commented 6 years ago

@xieziyu https://github.com/jsvr/Lenovo-SSCDFPC 这是我的项目地址

xieziyu commented 6 years ago

@jsvr 收到,多谢,我去看一下。

jsvr commented 6 years ago

嗯嗯

xieziyu commented 6 years ago

@jsvr 我看了一下,貌似并没有出现事件没有被执行的问题,从log看起来,MouseOut和MouseOver都被正确顺序触发了:

image


不过我注意到在两个国家边缘移动的时候,MouseOver会被额外多触发一次。 但这恐怕不是ngx-echarts的BUG了

还有一个问题:绑定到html上的函数和属性,不能用private修饰,需要改成public的,不然AoT编译时候会报错。

jsvr commented 6 years ago

你的那个版本代码是我调试的另一个状态,你把代码改成我这样, aaa @xieziyu

xieziyu commented 6 years ago

@jsvr 嗯,这个现象需要再深入调查一下,首先可以排除的是,chartMouseOver和chartMouseOut这两个事件接口是正常的。 MouseOut事件未被调用是和setOption导致地图重绘有关系的,重绘并不会取消事件侦听,但是可能影响到了echarts对鼠标位置判定,我怀疑是在重绘过程中,echarts判定鼠标初始位置是在地图之外的,所以它才会在移动过程中,不停地上报MouseOver,而理论上MouseOver只应该报一次。

xieziyu commented 6 years ago

@jsvr 找到个方法帮你解决问题,就是如果发现是同样的事件,就不要重绘地图:

export class MapInformationComponent implements OnInit, AfterViewInit {
  lastEvent: any = {};
  // ....

  private onChartEvent(event: any, type: string) {
    console.log('chart event:', type, event);
    // add these codes:
    if (this.lastEvent.name === event.name && this.lastEvent.type === type) {
      return;
    } else {
      this.lastEvent.name = event.name;
      this.lastEvent.type = type;
    }
    // ...
jsvr commented 6 years ago

我换了个思路这个问题解决了,使用dispatchAction的highlight属性配置,给dataindex传一个地图的数组 @xieziyu bbb

xieziyu commented 6 years ago

@jsvr 太好了,你的解决方案更好!最大程度避免了重绘

jsvr commented 6 years ago

@xieziyu 真的太谢谢你了, 首次使用angular些项目,用ngx-echart,没想到还能作者沟通交流,真的很感谢,我最近都在做关于地图绘制数据方面的工作,希望有机会一块交流.我的微信 15891785237希望可以认识你

jsvr commented 6 years ago

@xieziyu ,嗯嗯对的,他的原生一些属性方法就是为了避免你从新绘制地图,应该往那方靠拢