【问题标题】:Getting error on vis js eventsvis js事件出错
【发布时间】:2018-07-11 10:00:23
【问题描述】:

我正在vue.js 应用程序中构建时间线,因此我决定使用vis.js,但是当我想添加一些事件时遇到了问题。首先,当我设置@drop="myDropCallback()" 并且当我放下一个项目时没有任何反应,因此不会调用该函数但是当我输入@mouseOver="myDropCallback()" 然后它可以工作,这很奇怪。

第二次当我在做mouseOver 事件时,我想用this.$refs.timeline.getEventProperties(event) 获取事件属性,但我每次都收到这个错误

“点击”事件处理程序中的错误:“TypeError:无法读取未定义的属性“中心””

还有这个错误

无法读取未定义的属性“中心”

那么有人知道如何解决这个问题吗?还是我做错了什么?

模板

<timeline v-if="items.length > 0" ref="timeline"
  :items="items"
  :groups="groups"
  :options="options"
  @drop="myDropCallback()">
</timeline>

拖放功能

myDropCallback: function (event) {
  console.log('value', this.$refs.timeline.getEventProperties())
},

时间线图片

【问题讨论】:

    标签: javascript vue.js vuejs2 vis.js vis.js-timeline


    【解决方案1】:

    这是 vis.js 源代码的摘录。您会注意到它尝试做的第一件事是找到事件的中心值。

    Timeline.prototype.getEventProperties = function (event) {
      var clientX = event.center ? event.center.x : event.clientX;
      var clientY = event.center ? event.center.y : event.clientY;
      var x;
      if (this.options.rtl) {
        x = util.getAbsoluteRight(this.dom.centerContainer) - clientX;
      } else {
        x = clientX - util.getAbsoluteLeft(this.dom.centerContainer);
      }
      var y = clientY - util.getAbsoluteTop(this.dom.centerContainer);
    
      var item = this.itemSet.itemFromTarget(event);
      var group = this.itemSet.groupFromTarget(event);
      var customTime = CustomTime.customTimeFromTarget(event);
    
      var snap = this.itemSet.options.snap || null;
      var scale = this.body.util.getScale();
      var step = this.body.util.getStep();
      var time = this._toTime(x);
      var snappedTime = snap ? snap(time, scale, step) : time;
    
      var element = util.getTarget(event);
      var what = null;
      if (item != null) {
        what = 'item';
      } else if (customTime != null) {
        what = 'custom-time';
      } else if (util.hasParent(element, this.timeAxis.dom.foreground)) {
        what = 'axis';
      } else if (this.timeAxis2 && util.hasParent(element, this.timeAxis2.dom.foreground)) {
        what = 'axis';
      } else if (util.hasParent(element, this.itemSet.dom.labelSet)) {
        what = 'group-label';
      } else if (util.hasParent(element, this.currentTime.bar)) {
        what = 'current-time';
      } else if (util.hasParent(element, this.dom.center)) {
        what = 'background';
      }
    
      return {
        event: event,
        item: item ? item.id : null,
        group: group ? group.groupId : null,
        what: what,
        pageX: event.srcEvent ? event.srcEvent.pageX : event.pageX,
        pageY: event.srcEvent ? event.srcEvent.pageY : event.pageY,
        x: x,
        y: y,
        time: time,
        snappedTime: snappedTime
      };
    };
    

    因此,您的问题很可能是由于没有为该方法提供有效事件。我相信这是因为您没有为 getEventProperties 方法提供任何参数。我会尝试类似:

    myDropCallback: function (event) {
      console.log('value', this.$refs.timeline.getEventProperties(event))
    },
    

    另外,这里有一篇很好的堆栈溢出帖子,由 vis.js 的一位作者回答:vis.js timeline how to add mouse over event to vis-item box-box

    【讨论】:

    • 这就是 vis.js 的 getEventProperties 函数?我试图将事件发送到函数但我得到了同样的错误。
    • 当我从括号中删除事件时,我没有收到任何错误,getEventProperties 正在返回我想要的。但这就是 mouseOver、mouseLeave、click 等。当我尝试执行 drop 事件时,什么也没有发生。我需要自己编写放置事件还是?
    • 这是另一个很好的例子。 visjs.org/examples/timeline/other/drag&drop.html 查看开发人员工具中的源选项卡并查看 drag&drop.html 的源代码。看起来您需要在要拖动到时间轴上的项目上注册 dragstart 事件侦听器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-22
    • 1970-01-01
    • 1970-01-01
    • 2018-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多