Ng-if 导致 Angular js 中的内存泄漏!图片:https ://www.mediafire.com/?ojoc55ccnyqlxyb
我的应用有两个页面
第一页是主页,显示搜索输入
第二页是释放内存的空页。
我是如何检测到泄漏的?
从链接运行我的应用程序:http
://www.mediafire.com/download/y5f6f326f3zo0ch/LeakProject_-_Copy.7z在匿名模式下使用 chrome,F12 -> 配置文件 -> 记录堆分配。在点击空白页面后点击主页并重复更多时间,结果没有任何泄漏。
但是,如果您键入任何要搜索的内容,然后您将转到 emptypage 以释放内存。你会得到泄漏。
我发现,当转到空白页面时,主页中 ovNgListBox 的范围会破坏。我认为 scope.textSearch 的值将更改为 undefined 并且 angualr.js 的 ng-if 中的 $scope.$watch 将执行以破坏范围。但反之亦然:虽然 html 的范围
<ov-ng-list-box class="ng-isolate-scope"><div ng-init="showFilter=true" class="pull-right">
被摧毁。
但范围
<input type="text" ng-model="textSearch" ng-if="showFilter" placeholder="please type here to search..." class="search ng-scope ng-pristine ng-valid">
没有被破坏。为什么为什么?
即使您将 scope.showFilter 的值更改为 false ,那么 $scope.$watch 的 in-if 也不会被调用。
片段代码:
// templateleak.html <br/>
<div class="pull-right" ng-init="showFilter=true" >
<input type="text" class="search" placeholder="please type here to search..." ng-if="showFilter" ng-model="textSearch"/>
</div>
// my directive
app.directive('ovNgListBox', [function () {
return {
restrict: 'AE',
scope: {},
templateUrl: 'views/template/templateLeak.html',
controller: ['$scope',function(scope){
console.log("Im in link of directive");
scope.textSearch='';
scope.search = function(){};
scope.$on('$destroy', function(){
scope.showFilter=false;
});
}]
};
}])
//angular.js
var ngIfDirective = ['$animate', function($animate) {
return {
transclude: 'element',
priority: 600,
terminal: true,
restrict: 'A',
$$tlb: true,
link: function ($scope, $element, $attr, ctrl, $transclude) {
var block, childScope, previousElements;
$scope.$watch($attr.ngIf, function ngIfWatchAction(value) {
if (toBoolean(value)) {
if (!childScope) {
//