我正在试着和knockout的宣传单结婚,我有一个小问题,我已经创建的装订。我现在有这样的想法:
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"?
发布于 2015-09-23 22:25:14
所以有没有一个好的方法来平移地图并引起
呢?
不,如果不扩展L.Map并添加所需的功能,就不会。如果API发生变化,这可能会带来麻烦,因此这并不是一个真正的选择。
为什么不在调用panTo之前使用map.off('moveend', function () {});方法删除处理程序,然后使用map.on('moveend', function () {});方法重新附加处理程序呢?
https://stackoverflow.com/questions/32741521
复制相似问题