Polymer 1.0 / leaflet-map 1.0 地图在点击按钮时不能始终如一地返回给定点
Polymer 1.0 / leaflet-map 1.0 Map not consistently returning to given point on button click
我正在尝试使用 Polymer 1.0 和 leaflet-map 1.0 实现地图,它有一个按钮,单击该按钮时应将地图平移到当前地理位置的中心。
地图('mymap')和'geoButton'是主索引页面中同一级别的元素。我有一些类似的作品,但不一致。
地图是这样设置的(现在初始中心是硬编码的):
<leaflet-map id="mymap" latitude="40.707149800" longitude="-74.002101900" zoom="14">
<leaflet-geolocation id="locator" enable-high-accuracy latitude="{{latitude}}" longitude="{{longitude}}" watch="true">
</leaflet-geolocation>
...
在 geoButton 元素中,我在单击按钮时将定位器经纬度分配给地图经纬度:
mymap.latitude = locator.latitude;
mymap.longitude = locator.longitude;
在 leaflet-core.html(具有从 Leaflet.js 继承的属性和事件)中,纬度和经度属性都有一个观察者方法 '_viewChanged':
_viewChanged: function(newValue, oldValue) {
if (this.map) {
this.async(function() {
this.map.setView(L.latLng(this.latitude, this.longitude), this.zoom);
console.log("new lat? " +this.latitude );
console.log("new long? " +this.longitude );
});
}
}
问题是地图并不总是重置到新的中心。如果我将地图平移到远离初始点的位置,然后单击地理按钮,它将重新居中(调用 'viewreset' 事件)。此外,如果我在单击 geoButton 后拖动地图,地图将重置到正确的中心。
如果我删除观察者方法中的异步函数,并直接调用 'this.map.setView',地图实际上会正确地重新居中到地理定位点。但在这种情况下,如果我平移地图,它将 'bounce' 回到地理定位的纬度(经度将保留在我平移地图的任何地方)。我认为这是因为'_viewChanged'被调用了两次,但是第二次纬度与第一次调用没有变化。
我是否可以在调用 this.map/.setView 之前在观察者方法中强制对地图进行某种重置或刷新(这似乎是我在调用该方法后拖动地图时发生的情况)?或者,我还缺少其他东西吗?
经过更多测试后,我注意到如果我注释掉:
// mymap.latitude = locator.latitude;
然后地图将缩放到正确的(地理定位的)经度,但将保持在单击按钮之前地图设置的任何纬度...如果我改为注释掉经度线,情况也是如此;然后地图平移到正确的(地理定位的)纬度和当前经度。
换句话说,我可以正确传递一个更新的 属性,但不能传递两个...都使用相同的观察者方法。
我找到了解决办法。关键是向 leaflet-core 元素添加一个函数,以便我可以同时传递新的纬度和经度,然后在按钮的事件处理程序中调用该方法:
(传单中-core.html)
setToPoint: function(newLat, newLong){
if (this.map) {
this.async(function() {
this.map.setView(L.latLng(newLat, newLong), this.zoom, {pan: {animate: true}});
this.map.invalidateSize();
});
}
},
(在地理按钮元素中 - 点击回调)
mymap.setToPoint(locator.latitude, locator.longitude);
我正在尝试使用 Polymer 1.0 和 leaflet-map 1.0 实现地图,它有一个按钮,单击该按钮时应将地图平移到当前地理位置的中心。
地图('mymap')和'geoButton'是主索引页面中同一级别的元素。我有一些类似的作品,但不一致。
地图是这样设置的(现在初始中心是硬编码的):
<leaflet-map id="mymap" latitude="40.707149800" longitude="-74.002101900" zoom="14">
<leaflet-geolocation id="locator" enable-high-accuracy latitude="{{latitude}}" longitude="{{longitude}}" watch="true">
</leaflet-geolocation>
...
在 geoButton 元素中,我在单击按钮时将定位器经纬度分配给地图经纬度:
mymap.latitude = locator.latitude;
mymap.longitude = locator.longitude;
在 leaflet-core.html(具有从 Leaflet.js 继承的属性和事件)中,纬度和经度属性都有一个观察者方法 '_viewChanged':
_viewChanged: function(newValue, oldValue) {
if (this.map) {
this.async(function() {
this.map.setView(L.latLng(this.latitude, this.longitude), this.zoom);
console.log("new lat? " +this.latitude );
console.log("new long? " +this.longitude );
});
}
}
问题是地图并不总是重置到新的中心。如果我将地图平移到远离初始点的位置,然后单击地理按钮,它将重新居中(调用 'viewreset' 事件)。此外,如果我在单击 geoButton 后拖动地图,地图将重置到正确的中心。
如果我删除观察者方法中的异步函数,并直接调用 'this.map.setView',地图实际上会正确地重新居中到地理定位点。但在这种情况下,如果我平移地图,它将 'bounce' 回到地理定位的纬度(经度将保留在我平移地图的任何地方)。我认为这是因为'_viewChanged'被调用了两次,但是第二次纬度与第一次调用没有变化。
我是否可以在调用 this.map/.setView 之前在观察者方法中强制对地图进行某种重置或刷新(这似乎是我在调用该方法后拖动地图时发生的情况)?或者,我还缺少其他东西吗?
经过更多测试后,我注意到如果我注释掉:
// mymap.latitude = locator.latitude;
然后地图将缩放到正确的(地理定位的)经度,但将保持在单击按钮之前地图设置的任何纬度...如果我改为注释掉经度线,情况也是如此;然后地图平移到正确的(地理定位的)纬度和当前经度。 换句话说,我可以正确传递一个更新的 属性,但不能传递两个...都使用相同的观察者方法。
我找到了解决办法。关键是向 leaflet-core 元素添加一个函数,以便我可以同时传递新的纬度和经度,然后在按钮的事件处理程序中调用该方法:
(传单中-core.html)
setToPoint: function(newLat, newLong){
if (this.map) {
this.async(function() {
this.map.setView(L.latLng(newLat, newLong), this.zoom, {pan: {animate: true}});
this.map.invalidateSize();
});
}
},
(在地理按钮元素中 - 点击回调)
mymap.setToPoint(locator.latitude, locator.longitude);