Leaflet-标记点击事件工作正常,但回调函数中未定义类的方法

Posted

技术标签:

【中文标题】Leaflet-标记点击事件工作正常,但回调函数中未定义类的方法【英文标题】:Leaflet- marker click event works fine but methods of the class are undefined in the callback function 【发布时间】:2018-06-18 15:29:54 【问题描述】:

我正在使用以下代码将回调函数添加到 click 事件的一些传单标记(我不知道先验的数字):

newArray.forEach(p => 
  let marker = L.marker(latLng).on('click', this.markerClick).addTo(newMap)
  marker.bindPopup(content)
  marker.addTo(newMap)
  marker.openPopup()
)

在类中有一个函数markerClick 这样做:

markerClick(e) 
  console.log("Inside marker click " + e.latlng.lat + "  " + e.latlng.lng)
  this.displayError("You clicked on the marker")

console.log 正在正确打印标记的latlng 的值,但是在调用displayError 时会抛出运行时错误,提示:

this.displayError 不是函数

这是一个在类中声明的函数,我用来根据我的需要显示带有自定义消息的 toast。这是代码:

displayError(messageErr: string) 
  let toast = this.toastCtrl.create(
    message: messageErr,
    duration: 3000,
    position: 'top'
  );
  toast.present();

为什么说那不是函数?

编辑:不仅仅是displayError,类的每个函数都会给出这个消息。

【问题讨论】:

【参考方案1】:

这是一个经典的 javascript 错误。

this 在 JavaScript 中不一定引用您的类实例对象。它是函数被调用时的上下文

您可以使用bind 强制此上下文,并且在许多库中您也可以轻松强制它。在这种情况下,使用 Leaflet,您可以在附加事件侦听器时将第三个参数传递给 on

// Force current `this` to be the context when `this.markerClick` is called
marker.on('click', this.markerClick, this);

bind 会是:

marker.on('click', this.markerClick.bind(this));

还有arrow function的解决方案,它使用this的上下文/值箭头函数在哪里定义,而不是在哪里调用:

marker.on('click', (event) => this.markerClick(event));

【讨论】:

以上是关于Leaflet-标记点击事件工作正常,但回调函数中未定义类的方法的主要内容,如果未能解决你的问题,请参考以下文章

Leaflet Popup 未注册点击事件

Angular 9 和谷歌地图标记点击事件无法正常工作

如何在“popupopen”事件期间识别 Leaflet 的标记?

href 标记中的内容安全策略错误,但在内联事件处理程序上工作正常

JS,单元测试:期待回调

R小册子中的标记鼠标点击事件有光泽