Утечка памяти с поставщиком приложений uigrid 3 и угловыми привязками выражений 1.5 - PullRequest
0 голосов
/ 31 августа 2018

У меня странная утечка памяти.

Я использую uigrid appScopeProvider, чтобы иметь возможность выбрать строку в сетке и вызвать привязку выражения ("&"), чтобы подтвердить мой выбор и закрыть мой компонент.

Сегодня утром, используя инструменты памяти Chrome, я обнаружил, что родительский элемент этого компонента никогда не был освобожден, а также этот компонент. С помощью инструмента, который я нашел, причина была в uigrid.

Я попытался удалить использование этой привязки выражения внутри appScopeProvider, и утечка памяти исчезла.

Вот почему я убежден, что проблема здесь.

Вот пример кода

angular.module('myApp')
.component('myComp', {
  templateUrl: '....',
  controller: [MyCompCtrl],
  bindings: {
    onValidate: '&'
  }
}

function MyCompCtrl() {
  var ctrl = this
  ctrl.myData = []

  ctrl.gridOptions = {
    data: '$ctrl.myData',
    appScopeProvider: {
      onClick: function(row) {
        ctrl.onValidate({ $row: row.entity })
      }
    },
    rowTemplate: '<div ng-click="grid.appScope.onClick(row)" ng-repeat="(colRenderIndex, col) in colContainer.renderedColumns track by col.colDef.name\" class="ui-grid-cell" ui-grid-cell ></div>',
    columnDefs: [...]
  }
}

При щелчке по моей строке вызывается привязка onValidate, родительский компонент получает данные, а компонент удаляется. У меня также есть кнопка на этом компоненте, которая позволяет мне проверить текущую строку, не касаясь сетки. Если я подтверждаю кнопкой, у меня нет утечки памяти.

Кажется, что проблема очевидна, когда onClick вызывается в сетке appScope.

Я пробовал много вещей:

  • использовать объявленную функцию вместо блока
  • прослушивание события $ scope $ destroy и удаление appScopeProvider, обнуление выражения привязок, обнуление appScopeProvider.onClick
  • использовать события на rootScope внутри onClick и прослушивать событие снаружи для вызова onValidate
  • используйте eval () для вызова функции из строки, чтобы эта сетка не сохраняла ссылку на мою привязку
  • используйте то, что я здесь прочитал https://blog.meteor.com/an-interesting-kind-of-javascript-memory-leak-8b47d2e7f156 об этом, обнуляя множество вещей в onClick и в событии $ scope $ destroy
  • call ctrl.gridApi.grid.appScope. $ Destroy

Ничего не сработало, и у меня закончились идеи. Я уже искал что-то подобное в google и stackoverflow, но ничего не нашел

Полагаю, мне нужно сделать что-то конкретное для события $ scope $ destroy, чтобы очистить мой uigrid, чтобы он освободил мой компонент, но что?

Кто-нибудь уже сталкивался с чем-то подобным?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...