次のリーフレット ディレクティブを使用すると、Angular アプリで明らかなメモリ リークが発生します: https://github.com/tombatossals/angular-leaflet-directive。
ディレクティブは問題なく動作しますが、ディレクティブを使用してビューを離れたり戻ったりすると、メモリ フットプリントが増加し続けることに注意してください。
ディレクティブは、 https ://github.com/Leaflet/Leaflet にあるリーフレット JavaScript ライブラリから構築されます。
私は次のようにディレクティブを使用します。
<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);
});
破棄すると、関数 unresolveMap が呼び出されます。
this.unresolveMap = function (scopeId) {
var id = leafletHelpers.obtainEffectiveMapId(maps, scopeId);
maps[id] = undefined;
};
これは私が得た限りです。誰かが似たようなものに出くわしたり、この問題をさらに攻撃する方法についてアイデアを持っている場合は、大いに感謝します:)