更改ng-view内容后,不会释放保留的内存

时间:2015-01-02 22:30:15

标签: javascript angularjs angularjs-scope ng-view

我在AngularJS中实现了音频播放器应用程序,但它消耗了大量的RAM。我正在做的一系列动作如下:

  1. 路由到登录页面
  2. 登录然后转到下一页
  3. 注销
  4. 多次重复步骤1到3次
  5. 令人惊讶的是,第一步的内存是 38 MB ,然后在第二步后增加到 211 MB ,在第三步之后 > 249 MB 等等,所以它是累积的,并且在任何 ng-view 更改后都没有释放内存

    这是我的代码示例:

    index.html 页面

    <html ng-app="myApp">
       <head><!-- application dependencies (js and css files) --></head>
       <body>
          <div ng-view></div>
       </body>
    </html>
    

    app.js 文件

    var app = angular.module('myApp', ['ngRoute']);
    
    app.config(['$routeProvider', '$locationProvider', '$httpProvider',
        function ($routeProvider, $locationProvider, $httpProvider) {
            $routeProvider.when('/login', {
                templateUrl: 'login.html',
                controller: 'loginController'
            });
    
            $routeProvider.when('/', {
                templateUrl: 'home.html',
                resolve:{/** resolve function for login checking */}
                controller: 'homeController'
            });
        }]);
    

    我在$templateCache中尝试了清除question的解决方案,但是在我尝试它并且问题不在模板本身的情况下,它不能解决我的问题错误的 DOM和控制器数据

    如何处理这个内存问题,所以当我在ng-view中更改视图时它不会占用所有这些内存(因为它不是模板大小)

    更新1:

    我在解析登录数据后使用$ location.path('/ route')登录或注销时在视图之间切换,并在注销后检查服务器的响应后,这可能是问题吗?

    更新2:

    我创建了一个plunker来模拟过多切换视图时的内存增加(当然这不是实际的数字,因为它是模拟)

2 个答案:

答案 0 :(得分:1)

有趣的是,loginController似乎没有从内存中清除。您可能必须尝试自己触发$destroy()以清除该控制器。这假设它被多次加载。

另外一些可能有用的资源:blog post about $destroy() somewhat similar github issue

答案 1 :(得分:0)

我认为您需要实施基于angular-websocket的方法,类似于Trello,在一段时间后,您要求用户更新其页面以接收系统的新更新或刷新其套接字连接已超时?根据您的设置,您可能会发现本教程很有用:Writing an AngularJS App with Socket.IO

阅读您提及的问题的accepted answer的最新更新。