uigrid 3 Appscope提供程序和角度1.5组件表达式绑定导致的内存泄漏

时间:2018-08-31 20:16:02

标签: javascript angularjs memory-leaks angular-ui-grid angular-components

我正面临着奇怪的内存泄漏。

我正在使用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绑定,组件的父级接收数据,并且该组件被删除。 我在此组件上也有一个按钮,它使我无需触摸网格即可验证当前行。 如果我使用按钮进行验证,则不会有任何内存泄漏。

当在网格appScope上调用onClick时,问题似乎很明显。

我尝试了很多事情:

  • 使用声明的函数而不是块
  • 收听$ scope $ destroy事件并删除appScopeProvider,取消绑定表达式,取消appScopeProvider.onClick
  • 在onClick内部的rootScope上使用事件,并在外部监听事​​件以调用onValidate
  • 使用eval()从字符串中调用函数,以防止此网格保留对我的绑定的引用
  • 通过取消在onClick和$ scope $ destroy事件中的许多内容,来使用我在这里https://blog.meteor.com/an-interesting-kind-of-javascript-memory-leak-8b47d2e7f156所读的内容
  • 致电ctrl.gridApi.grid.appScope。$ destroy

没有任何效果,我没有主意。我已经在google和stackoverflow中搜索了类似内容,但未找到任何内容

我想我必须在$ scope $ destroy事件上做一些特定的事情来清理我的uigrid,以允许它释放我的组件,但是怎么办?

有人已经面临过类似的事情吗?

0 个答案:

没有答案