Angular Kendo-ui: увеличение кучи js, количества узлов и слушателей. Может ли кто-нибудь дать мне знать, как избежать постоянного увеличения количества узлов, кучи js и слушателей?

0

Я использую компоненты 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);


});

});

  • 0
    При увеличении количества узлов и слушателей размер кучи JS постоянно увеличивается.
Теги:
asp.net-mvc
angular-ui-router
kendo-ui
routing

1 ответ

0
Лучший ответ

Удален мой пользовательский код очистки из 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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню