Leaflet Routing Machine 在不使用 .remove() 的情况下隐藏路由

Leaflet Routing Machine hide route without using .remove()

我应该如何在 mouseout 事件中隐藏 Leaflet Routing Machine 路线和标记?

目前,我有常规的 Leaflet 标记,其中有 mouseover/mouseout 个事件。当触发鼠标悬停事件并使用 L.Routing.control

创建属于该标记的路线时
    route = L.Routing.control({
      show: false,
      addWaypoints: false,
      draggableWaypoints: false,
      fitSelectedRoutes: false,
      waypoints: [
        L.latLng(locations.aLat, locations.aLng), // Hardcoded coordinates
        L.latLng(locations.bLat, locations.bLng), // Hardcoded coordinates
      ],
    });
    route.addTo(map);

当 mouseout 事件被触发时,我调用 route.remove() 完全删除路由。

这种方法的问题:

我尝试在 mouseout 事件中将路由不透明度设置为 0,将标记图标大小设置为 0,但是,您不能在 Leaflet Routing Machine 中动态更改样式。

我采取的另一种方法是给路由命名 css class 并尝试设置 display: none 但是将 classes 分配给许多不同的路由真的很麻烦解决这个问题的方法。

如果你想玩的话,这个演示非常简洁。(更新后的作品符合预期) 抓住它 here

在这种情况下,您可能会使用相同的参数重复调用昂贵的或 IO 相关的函数,最好将该函数包装在可记忆的可调用函数中。

这样的函数将计算一次值,然后存储它,如果再次请求,return 存储的值。

例如:

function very_expensive(argument) {
    //.....
    return stuff
}

let cache = {}

function from_cache(argument) {
    if (!(argument in cache)) {
        cache[argument] = very_expensive(argument);
    }

    return cache[argument]
}

隐藏但不移除的问题是该层仍在 DOM 中,并且如果您有很多这些不可见元素(如果您的用户滚动了很多元素,这可能会很快发生)标记),这会降低性能。这也是一个更混乱的解决方案。

出于同样的原因,使用 lru 缓存,因为它只存储最近的缓存,防止缓存无限增长。如果您不自己动手,NPM 上有多种实现方式。

解决方案是创建一次路线并将其保存在某个地方供以后使用。在我的例子中,它保存在 marker.options

marker = L.marker(pointA, {
options: {
  route: createRoute(pointA, pointB), // Function that return route object(L.Routing.control)
 },
})

创建路线后,您可以:

  • 检查它是否在地图上:
    if (marker.options.options.route._map) { Do something }
  • 将其添加到地图中:
    marker.options.options.route.addTo(map);
  • 将其从地图中删除:
    marker.options.options.route.remove();

您可以找到一个工作演示 here