У меня странная утечка памяти.
Я использую 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, чтобы он освободил мой компонент, но что?
Кто-нибудь уже сталкивался с чем-то подобным?