【问题标题】:Getting a reference to a leafletjs instance from a django-leaflet form从 django-leaflet 表单获取对 Leafletjs 实例的引用
【发布时间】:2014-05-31 09:02:38
【问题描述】:

使用 django-leaflet 我创建了如下表单

class AnnotationForm(forms.ModelForm):
     <crispy forms stuff redacted from here for brevity>     

    class Meta:
        model = Annotation # Your user model
        fields= ['name','annotationType','description','location_point','document','e']
        widgets = {'location_point': LeafletWidget(),'e':forms.HiddenInput()}

它以正常方式从视图中实例化。

在模板中;-

        {% crispy annotation_form %}

现在。在开始加载正文时,它会隐藏包含地图的 div,而在其他地方有一些代码基本上会监视 annotationType 下拉列表,如果选择了“位置”,它会取消隐藏 div。

问题是,leafletjs 似乎不喜欢被实例化隐藏,并且似乎对它的界限有点​​困惑。因此,我假设答案是在地图上调用 _onresize(),但是我似乎找不到如何获取对地图实例的引用。

L.map('id_annotation_location_point_map')._onResize()

..只是产生一个地图已经初始化的抱怨。检查表单生成的代码似乎是在 (function() { etc etc } )() 类型闭包内创建的地图,这使得从那里劫持变量是不可行的。

所以我的问题是,在这种情况下如何获得对 leaflet.js 地图的引用?

How can I get a leaflet.js instance using only a DOM object?,但它似乎并没有真正回答这个问题,只是提出一个在我的情况下不可用的替代方案。

【问题讨论】:

  • 我确实找到了一个答案,但它不是很令人满意,我怀疑在不同的浏览器中可能会有不同的结果。 django-forms 似乎有一个回调,用于在地图上做一些额外的工作。它可以劫持回调并从那里获取对地图的引用。本质上,通过在生成的函数之后声明具有相同名称的函数,您可以提供自己的函数,您可以在其中获取该引用并将其存储起来以备后用。这是一个令人讨厌的“解决方案”,所以我不会将其作为解决方案发布,以防有​​人提出更好的解决方案。
  • 总比没有好..

标签: javascript django leaflet


【解决方案1】:

我遇到了完全相同的问题 - 使用 django-leaflet 在隐藏的 div 中渲染地图,但无法弄清楚如何触发 _onResize/invalidateSize 函数。

我不知道这是一个特别好的解决方案,但我所做的是从 map:init 事件中获取对地图的引用,如下所示:

$(document).ready(function() {
    // Store the variable to hold the map in scope
    var map;
    
    // Populate the map var during the map:init event (see Using Javascript callback function)
    // here https://github.com/makinacorpus/django-leaflet
    $(window).on('map:init', function(e) {
      map = e.originalEvent.detail.map;
    });

    // Hide the map
    $('#hiddenDivWithMap').hide();

    // Click the thing which shows the map
    $('#myButton').click(function() {
      $('#hiddenDivWithMap').show();
      map.invalidateSize()
    });
});

不管怎样,这对我有用。虽然它没有设置地图的缩放/范围/边界,但我仍然需要弄清楚如何做到这一点。

【讨论】:

  • 应该这样做。比我的版本好很多。
  • 我在map:init 函数中添加了一个alert,而在Firefox 中,它只会在我Ctrl+F5 时进入该函数。如果我只是正常加载页面,它不会调用此函数。知道为什么吗?
  • 抱歉不确定。您是否尝试过使用纯 js window.addEventListener("map:init", function (e) { 或其他方式进行操作?我还发现这可能有用django-leaflet.readthedocs.io/en/latest/templates.html
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-14
  • 1970-01-01
  • 2012-12-26
  • 2013-12-28
  • 1970-01-01
  • 2018-04-25
  • 2014-04-23
相关资源
最近更新 更多