2013-02-20 30 views
25

Tôi cần có khả năng tải/dỡ các ứng dụng góc động mà không gây rò rỉ bộ nhớ. Trong jQuery bạn có thể thực hiện $("#elementHoldingMyWidget").remove(); và mã hủy diệt thích hợp được thực thi, các trình xử lý sự kiện không bị ràng buộc, v.v.Làm thế nào để tiêu diệt một ứng dụng angularjs?

Tôi không thể tìm thấy bất kỳ thứ gì trong tài liệu góc đề cập đến khả năng xé xuống ứng dụng khi ứng dụng đã được khởi động.

nỗ lực 1 của tôi là để tiêu diệt các rootScope như vậy:

var rootScope = $("body").scope(); 
rootScope.$destroy(); 

Nhưng điều này dường như không được làm việc, và tôi không chắc chắn như thế nào phun và dịch vụ sẽ được dọn dẹp ngay cả khi nó đã làm.

Việc này nên được thực hiện như thế nào?

+4

Tôi nghĩ câu hỏi bạn cần hỏi là tại sao bạn cần xóa ứng dụng khỏi bộ nhớ? Một ví dụ kịch bản mà điều này là cần thiết sẽ giúp làm rõ nó rất nhiều. –

Trả lời

0

CẬP NHẬT ngày 10 tháng 3 năm 2013: Tôi nhận thấy $ ('body'). Empty(); không làm hỏng ứng dụng. Nó vẫn còn sống.

POST ORIGINAL:

Vâng, bài đăng này: https://github.com/angular/angular.js/issues/1537#issuecomment-10164971 tuyên bố rằng không có ứng dụng 'chính thức' xé xuống (tại thời điểm viết bài), nhưng bạn chỉ có thể làm rỗng các yếu tố giữ ứng dụng như vậy :

$('body').empty(); 

Nếu đây không phải là những gì bạn đang tìm kiếm bạn có thể đi qua các bước này cho một giải pháp tạm thời để xé ứng dụng của bạn xuống: https://github.com/angular/angular.js/issues/1537#issuecomment-10184033

+0

Vâng. Tôi sẽ nói không có nó thực sự không hỗ trợ nó. Cảm ơn. – CHS

+4

Btw. Tôi thấy rằng $ ('body'). Empty(); không làm hỏng ứng dụng. Nó vẫn còn sống. – mlunoe

10

Để xé xuống ứng dụng của tôi mà không cần trình bày cho người dùng một trang trắng qua $('body').empty, tôi lần đầu tiên $delete() phạm vi đứa trẻ và sau đó loại bỏ tất cả các thuộc tính từ $rootScope:.

/* 
* Iterate through the child scopes and kill 'em 
* all, because Angular 1.2 won't let us $destroy() 
* the $rootScope 
*/ 
var scope = $rootScope.$$childHead; 
while (scope) { 
    var nextScope = scope.$$nextSibling; 
    scope.$destroy(); 
    scope = nextScope; 
} 

/* 
* Iterate the properties of the $rootScope and delete 
* any that possibly were set by us but leave the 
* Angular-internal properties and functions intact so we 
* can re-use the application. 
*/ 
for(var prop in $rootScope){ 
    if (($rootScope[prop]) 
     && (prop.indexOf('$$') != 0) 
     && (typeof($rootScope[prop]) === 'object')) { 
      $rootScope[prop] = null; 
     } 
} 
16

Sử dụng AngularJS 1.4.0, $ rootScope $ phá hủy() đang hoạt động trở lại (vì nó đã bị hỏng trong phiên bản 1.2). Sử dụng giấy phép này để chuyển đổi giữa một số ứng dụng angularJS:

var appManager = new function() { 
    this.currentAppName; 
    this.currentApp; 

    this.startApp = function (appContainerId, appName) { 
     if (this.currentApp) { 
      this.destroyApp(this.currentApp, this.currentAppName); 
     } 
     var appContainer = document.getElementById(appContainerId); 
     if (appContainer) { 
      this.currentAppName = appName; 
      this.currentApp = angular.bootstrap(appContainer, [appName]); 
     } 
    } 

    this.destroyApp = function (app, appName) { 
     var $rootScope = app.get('$rootScope'); 
     $rootScope.$destroy(); 
    } 
} 

// Call this when page is ready to rebootsrap app 
appManager.startApp('divContainerId', 'app'); 
+0

Kết hợp điều này với 'angular.element ('# someNode'). Empty()' đã làm thủ thuật cho tôi. –

Các vấn đề liên quan