无法从函数传单中获取this.map

时间:2017-10-31 20:52:51

标签: javascript angular ionic-framework leaflet

我想做的是每秒在地图上找到用户位置。我知道我可以用setInterval(function(),1000);

调用一个函数

我正在使用

初始化地图
ionViewDidEnter() {
    this.map = leaflet.map("map").fitWorld();
    this.loadmap();
}

问题是我无法从定位功能到达地图。

function locate(){

var marker;

this.map.locate({
  setView: true,
  maxZoom: 120
}).on("locationfound", e => {
    if (!marker) {
        marker = new L.marker(e.latlng).addTo(this.map);
    } else {
        marker.setLatLng(e.latlng);
    }
}).on("locationerror", error => {
    if (marker) {
        map.removeLayer(marker);
        marker = undefined;
    }
});
}

如果我删除函数locate(); this.map.locate工作,但因为我想定位用户everysecond跟踪他们的位置我需要调用.locate everysecond所以我试图把它放在函数调用函数与setinterval每秒但它不工作。有什么办法找到用户而不将.locate放在函数内并调用它?

1 个答案:

答案 0 :(得分:0)

虽然您的问题并不完全清楚,但如果我理解正确,您试图将locate函数称为setInterval的第一个参数,但随后会收到一条错误消息,指出{{1}是未定义的还是类似的东西?

在这种情况下,您只需要意识到this.map是指函数调用者的上下文。当您使用thissetInterval相同)时,上下文不再是您的类实例对象(具有setTimeout的对象),而是全局上下文。这里解释了这个问题:https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/setInterval#The_this_problem

有几个简单的解决方案,请参阅Referencing "this" inside setInterval/setTimeout within object prototype methods

话虽如此,由于您希望定期跟踪用户的位置,为什么不依靠this.map watch选项?如果您正在尝试解决某些问题(可能是Leaflet .locate watch option breaks .locate after changing tab Ionic 3?),那么您很可能应该解决该问题,而不是尝试解决这些问题。