panTo而不举起活动

时间:2015-09-23 13:51:53

标签: knockout.js leaflet

我正在尝试将小册子与淘汰赛结合在一起,我对我创建的绑定有一个小问题。我现在有这个:

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”?

1 个答案:

答案 0 :(得分:3)

  

那么有一种很好的方法来平移地图并导致移动端吗?

不,不是没有扩展L.Map并添加所需的功能。如果API发生变化,这可能会导致麻烦,因此这不是一个真正的选择。

为什么不在使用panTo方法调用map.off('moveend', function () {});之前删除处理程序,然后使用map.on('moveend', function () {});方法重新附加处理程序?