Javascript 从django传单表单获取对传单JS实例的引用
使用django传单,我创建了如下表单Javascript 从django传单表单获取对传单JS实例的引用,javascript,django,leaflet,Javascript,Django,Leaflet,使用django传单,我创建了如下表单 class AnnotationForm(forms.ModelForm): <crispy forms stuff redacted from here for brevity> class Meta: model = Annotation # Your user model fields= ['name','annotationType','description','locat
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()}
现在。在body load开始时,它隐藏了包含贴图的div,其他地方有一些代码基本上监视annotationType下拉列表,如果选择了“location”,它将取消隐藏该div
问题是,JS似乎不喜欢被实例化为隐藏的,并且似乎对其边界有点困惑。我假设答案是在映射上调用_onresize(),但是我似乎找不到如何获取映射实例的引用
L.map('id_annotation_location_point_map')._onResize()
..只是产生一个投诉,说映射已经初始化。检查表单生成的代码似乎在(function(){etc})类型闭包中创建了映射,这使得从那里劫持变量变得不可行
所以我的问题是,在这种情况下,如何获得对传单.js地图的引用
有,但它似乎并没有真正回答这个问题,只是提出了一个在我的案例中不可用的替代方案。我遇到了完全相同的问题-使用django传单在隐藏的div中渲染地图,但不知道如何触发_onResize/invalidateSize函数 我不知道这是一个特别好的解决方案,但我所做的是从map:init事件中获取对map的引用,如下所示:
$(文档).ready(函数(){
//存储变量以在作用域中保存映射
var映射;
//在map:init事件期间填充map变量(请参阅使用Javascript回调函数)
//这里https://github.com/makinacorpus/django-leaflet
$(窗口).on('map:init',函数(e){
map=e.originalEvent.detail.map;
});
//隐藏地图
$('hiddendivithmap').hide();
//单击显示地图的对象
$(“#myButton”)。单击(函数(){
$('hiddendivithmap').show();
map.invalidateSize()
});
});代码>我确实找到了一个答案,但不是很令人满意,我怀疑在不同的浏览器中可能会有不同的结果。django表单似乎有一个回调,用于在地图上做一些额外的工作。它可能劫持回调并从那里获取地图的引用。本质上,通过在生成的函数后声明一个同名函数,可以提供您自己的函数,您可以在其中获取该引用并将其隐藏起来以供以后使用。这是一个令人讨厌的“解决方案”,所以我不会把它作为一个解决方案发布,以防有人想出更好的解决方案。总比什么都没有好。这应该可以做到。比我的版本好得多。我在map:init
函数中添加了一个alert
,在firefox中,它只在我Ctrl
+F5
时才会进入该函数。如果我只是正常加载页面,它不会调用此函数。知道为什么吗?对不起,我不知道。您是否尝试过在纯js窗口中执行此操作。addEventListener(“map:init”、函数(e){
或其他类似的工具?”我还发现这可能很有用
L.map('id_annotation_location_point_map')._onResize()