1

無論我使用以下單張指令,我的Angular應用程序中都有明顯的內存泄漏:https://github.com/tombatossals/angular-leaflet-directiveAngularJS單張內存泄漏

請注意,該指令工作正常,但內存佔用繼續增長,因爲我離開並返回到使用該指令的任何視圖。

該指令建立關閉JavaScript庫,發現這裏的傳單:https://github.com/Leaflet/Leaflet

我用的指令,如下所示:

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

在我的控制我延長傳單指令屬性範圍:

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' 
      } 
     } 
    } 
}); 

我不確定是什麼導致內存泄漏,但我相信它可能與事件偵聽器不會被刪除時$破壞爲瓣葉指令中稱爲:

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

在破壞功能unresolveMap叫:

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

這是據我得到了。如果有人遇到過類似的問題或者對如何進一步攻擊這個問題有任何想法,我將不勝感激:)

+0

我剛纔也注意到了這一點,並想知道你是否有任何進展確定泄漏發生在哪裏? – BrokenRobot

+0

你有沒有解決這個問題? – Lugaru

回答

0

您應該嘗試通過在$上添加一個map.remove()來完整刪除地圖銷燬處理程序(從傳單API它應該:「銷燬地圖並清除所有相關的事件監聽器」)。

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

您是否嘗試將id屬性分配給您的地圖?這就是attrs.id所指的。

<leaflet id="myMap" defaults="defaults" center="center" markers="markers" layers="layers"></leaflet>