我正在尝试将小册子与淘汰赛结合在一起,我对我创建的绑定有一个小问题。我现在有这个:
ko.bindingHandlers.map = {
init: function (element, valueAccessor, allBindings) {
var obj = valueAccessor();
var coordsObj = allBindings.get("location");
var coords = coordsObj ? ko.unwrap(coordsObj) : { lat: 41.5047729, lng: -81.6856701 };
var map = L.map(element).setView(coords, 16);
L.esri.basemapLayer("Streets").addTo(map);
map.on("moveend", function (e) {
var latlng = e.target.getCenter();
coordsObj(latlng);
});
obj(map);
},
update: function (element, valueAccessor, allBindings) {
}
};
ko.bindingHandlers.location = {
init: function (element, valueAccessor, allBindings) {
},
update: function (element, valueAccessor, allBindings) {
var map = ko.unwrap(allBindings.get("map"));
var val = valueAccessor();
var coords = ko.unwrap(val);
map.panTo(coords, { animate: true });
}
};
这是这样绑定的:
<div id="map" data-bind="map: map, location: location"></div>
这似乎有效,但如果我更新location
可观察对象,则会调用update
函数,该函数将根据需要调用map.panTo
。但是,.panTo
会导致moveend
事件触发,更新location
会导致update
功能再次触发,再次调用panTo
。 (在这一点上,你似乎没有得到moveend
,大概是因为它实际上没有移动)。
这不是什么大不了的事,它似乎并没有真正放慢速度,但它很烦人且效率低下,所以我希望能够原则上删除它。那么有一个很好的方法来平移地图导致moveend
开火吗?或者是否有一种很好的方式从location
绑定到map
绑定中的事件处理程序进行通信,以说“忽略此moveend
”?
答案 0 :(得分:3)
那么有一种很好的方法来平移地图并导致移动端吗?
不,不是没有扩展L.Map
并添加所需的功能。如果API发生变化,这可能会导致麻烦,因此这不是一个真正的选择。
为什么不在使用panTo
方法调用map.off('moveend', function () {});
之前删除处理程序,然后使用map.on('moveend', function () {});
方法重新附加处理程序?