Утечка памяти AngularJS Leaflet

В моем приложении Angular существует явная утечка памяти, когда я использую следующую директиву листовки: https://github.com/tombatossals/angular-leaflet-directive.

Обратите внимание, что директива работает нормально, однако объем памяти продолжает расти, когда я ухожу и возвращаюсь к любому представлению, использующему директиву.

Директива основана на javascript-библиотеке листовок, которую можно найти здесь: https://github.com/Leaflet/Leaflet.

Я использую директиву следующим образом:

<div ng-controller="Explore">
    <div leaflet defaults="defaults" center="center" markers="markers" layers="layers"></div>
</div>

Внутри моего контроллера я расширяю атрибуты директивы leaflet до области видимости:

    angular.extend($scope, {
    defaults: {
        dragging: true,
        doubleClickZoom: false,
        scrollWheelZoom: false,
        maxZoom: 12,
        minZoom: 12
    },
    center: {
        lat: $scope.cities[$scope.market.city][1],
        lng: $scope.cities[$scope.market.city][0],
        zoom: 12
    },
    markers: {},
    layers: {
        baselayers: {
            google: {
                name: 'Google Streets',
                layerType: 'ROADMAP',
                type: 'google'
            }
        }
    }
});

Я не уверен, что вызывает утечку памяти, но я полагаю, что это может быть связано с прослушивателями событий, которые не удаляются, когда $destroy вызывается в директиве листовки:

scope.$on('$destroy', function () {
    leafletData.unresolveMap(attrs.id);
});

При уничтожении вызывается функция unsolveMap:

this.unresolveMap = function (scopeId) {
    var id = leafletHelpers.obtainEffectiveMapId(maps, scopeId);
    maps[id] = undefined;
};

Это насколько я понял. Если кто-то сталкивался с чем-то подобным или имеет какие-либо идеи относительно того, как решить эту проблему дальше, я был бы очень признателен:)


person Rodhoohoo    schedule 17.04.2014    source источник
comment
Я тоже только что это заметил и хотел узнать, удалось ли вам выяснить, где происходит утечка?   -  person BrokenRobot    schedule 11.12.2014
comment
Вы исправили это?   -  person Lugaru    schedule 20.01.2015


Ответы (2)


Вы должны попытаться полностью удалить карту, добавив map.remove() в обработчик on $destroy (из API листовки это должно: «Уничтожает карту и очищает все связанные прослушиватели событий»).

scope.$on('$destroy', function () {
        leafletData.unresolveMap(attrs.id);
        map.remove();
      }); 
person user3575656    schedule 22.05.2014

Пробовали ли вы присвоить своей карте атрибут id? Это то, на что указывает attrs.id.

<leaflet id="myMap" defaults="defaults" center="center" markers="markers" layers="layers"></leaflet>
person Dean Quiñanola    schedule 08.08.2014