Я использую компоненты kendo с угловыми в своем приложении. Я проверяю утечки памяти, и я нахожу, что Nodes, Listeners, JS heap постоянно увеличивается. Если я нажимаю мусорный сбор в конце, все возвращается к норме, как раньше. Я смог постоянно следить за увеличением количества документов, но не мог обрабатывать кучу js, узлы и слушатели. Хронология временной шкалы Google Chrome и временная шкала Захват с собранным мусором в конце. Вот мой код appconfig.js
angular.module("tilesApp").run(function ($rootScope, $location, $route, $http, AuthenticationService) {
//check cookie of user
if (getCookie('username') != "") {
$rootScope.user = { identity: getCookie('username'), username: getCookie('username'), isAdmin: true };
$rootScope.isLoggedIn = true;
}// enumerate routes that don't need authentication
var routesThatDontRequireAuth = ['/login'];
$rootScope.$on('$routeChangeStart', function (event, next, current) {
var appElement = angular.element("#viewcontent");
//$rootScope.$destroy();
var appScope = angular.element(appElement).scope();
if (typeof (appScope) !== "undefined") {
var controllerScope = appScope.$$childHead;
controllerScope.$destroy();
controllerScope = null;
var element = document.getElementById("viewcontent");
while (element.lastChild) {
element.removeChild(element.lastChild);
}
$("#viewcontent").empty();
}
if (next && next.$$route) {
if (typeof ($rootScope.user) === "undefined" || typeof ($rootScope.isLoggedIn) === "undefined") {
window.location = "/login";
}
else
if ($rootScope.isLoggedIn === false || AuthenticationService.validateRole() === false) {
window.location = "/login";
}
}
});
$http.get("/Scripts/app/routeconfig.txt").then(function (response) {
var routes = response.data.routes;
$rootScope.routes = routes;
if (typeof (routes) !== "undefined") {
for (var i = 0; i < routes.length; i++) {
var url = routes[i].url;
$routeProviderReference.when(url, { templateUrl: url, });
}
}
$route.reload();
var lis = "";
for (var i = 0; i < $rootScope.routes.length; i++) {
lis += "<li><a href='./#" + routes[i].url + "' >" + routes[i].displayName + "</a></li>";
}
angular.element('#navtabs').html(lis);
$location.path(routes[0].url); //First route is assumed to be default route and hence user is navigated
}, function (errorResponse) {
// Handle error case
alert('Cannot load routes');
});});
Вот еще один код контроллера:
angular.module('tilesApp').controller("kendoSearchCtrl", function ($scope) {
$scope.monthPickerConfig = {
start: "day",
depth: "day",
format: "dd-MM-yyyy"
};$scope.startDate = "";
$scope.endDate = "";
$scope.selectOptions = {
placeholder: "Select leaders...",
dataTextField: "LeaderName",
dataValueField: "EID",
dataSource: {
transport: {
read: {
url: "/Scripts/leaders.txt",
dataType: "json"
}
}
}
};
$scope.selectedIds = [];
$scope.choiceData = new kendo.data.DataSource({
data: [{ text: "Foo", id: 1 },
{ text: "Bar", id: 2 },
{ text: "Baz", id: 3 }]
});
$scope.selectedChoiceId = 1;
$scope.checkboxModel = true;
$scope.businessModel = "";
$scope.dateType = null;
$scope.workSiteData = new kendo.data.DataSource({
data: [{ text: "S1", value: 1 },
{ text: "S1", value: 2 },
{ text: "S2", value: 3 },
{ text: "S3", value: 4 },
{ text: "S4", value: 5 }]
});
$scope.workSite = null;
$scope.$on('$destroy', function () {
kendo.destroy(document.body);
kendo.destroy($scope.workSiteData);
kendo.destroy($scope.choiceData);
kendo.destroy($scope.selectOptions);
kendo.destroy($scope.monthPickerConfig);
});
});
Удален мой пользовательский код очистки из kendoSearchCtrl.js и appconfig.js. Он работал как шарм. :)
1) В appconfig.js
$rootScope.$on('$routeChangeStart', function (event, next, current) {
if (next && next.$$route) {
if (typeof ($rootScope.user) === "undefined" || typeof ($rootScope.isLoggedIn) === "undefined") {
window.location = "/login";
}
else
if ($rootScope.isLoggedIn === false || AuthenticationService.validateRole() === false) {
window.location = "/login";
}
}
});
2) В kendoSearchCtrl.js
$scope.$on('$destroy', function () {
kendo.destroy(document.body);
$('.view-root-node').html('');
});
Нет утечек - Google Chrome TimeLine
Для получения дополнительной информации см. Эту ссылку: http://docs.telerik.com/kendo-ui/AngularJS/leak