2013-07-25 56 views
21

Có một rò rỉ bộ nhớ nặng trong ứng dụng của tôi nhưng tôi không tìm ra nguyên nhân, và đây là nền.Chúng ta có cần hủy liên kết trình lắng nghe sự kiện trong các chỉ thị khi góc bắt đầu phá hủy không?

  • Tôi đang sử dụng AngularJS + JQuery (plugin)
  • Nhiều người nghe đang bị ràng buộc như sau:

    $ (element) .Trên ("KeyUp", function() {});

Vì vậy, câu hỏi là

Tôi có cần phải unbind những thính giả trong chỉ thị bằng cách làm theo?

scope.$on("$destroy", function() { 
    $(element).off(); 
}); 

BTW, làm thế nào để bạn thường tìm ra rò rỉ bộ nhớ trong ứng dụng web? Tôi sử dụng hồ sơ của chrome (xem tại đây Profiling memory performance) nhưng tôi không thể theo dõi các mã nơi rò rỉ bộ nhớ. Bạn có đề nghị nào không?

Cảm ơn rất nhiều!

+0

Tôi không nghĩ rằng thats cần thiết trừ khi bạn đang ràng buộc tất cả các phạm vi đến $ rootScope. –

+1

Bạn không cần phải loại bỏ chúng, chúng thường là rác thu thập được. Bạn có thể muốn loại bỏ người nghe của cửa sổ mặc dù, như di chuyển hoặc các sự kiện tin nhắn nếu trình xử lý tương tác với các phần tử của phạm vi. Xem http://stackoverflow.com/questions/12528049/if-a-dom-element-is-removed-are-its-listeners-also-removed-from-memory – Kapep

Trả lời

14

Tài liệu góc để hủy phạm vi, ngụ ý rằng bạn cần xóa các sự kiện DOM.

http://docs.angularjs.org/api/ng.$rootScope.Scope#$destroy

Lưu ý rằng, trong AngularJS, đó cũng là một phá hủy jQuery kiện $, mà có thể được sử dụng để dọn dẹp nối kết DOM trước một yếu tố được lấy ra từ DOM.

+0

cảm ơn câu trả lời của bạn, tôi đã hủy liên kết những người nghe đó $ phá hủy quá trình, nhưng nó có vẻ không hữu ích cho vấn đề rò rỉ bộ nhớ của tôi. hmm ... – Edward

+0

Tôi vừa phát hiện ra rằng $ phá hủy evnet thực sự được kích hoạt sau khi dom bị xóa trong trường hợp của tôi :(thời gian gửi lỗi khác tôi nghĩ – Blowsie

+1

@Blowsie Có 2 loại sự kiện tiêu diệt $. . $ on ('$ destroy', cb) được gọi trước khi loại bỏ phần tử, còn lại là element.on ('$ destroy', cb) là một sự kiện jQ và được gọi sau khi loại bỏ phần tử. –

4

Tôi không đồng ý với câu trả lời được chấp nhận, rò rỉ bộ nhớ của bạn có thể có các nguyên nhân khác.

Check-out này cho một câu trả lời xuất sắc: AngularJS - Does $destroy remove event listeners?

+0

Tôi đã kiểm tra bài đăng đó nhưng tôi không hiểu tại sao bạn nghĩ vậy? Tôi nghĩ nó hỗ trợ Câu trả lời ở trên mà chúng ta cần phải tự loại bỏ những người nghe được tạo ra bởi JQuery khi phạm vi bị phá hủy BTW, vấn đề bộ nhớ của tôi đã được giải quyết sau khi tôi loại bỏ các trình lắng nghe – Edward

+3

Khi Góc loại bỏ một phần tử liên kết với một chỉ thị, nó gọi jQuery/jqLite Hàm '$ elem.remove()', được cho là sẽ loại bỏ bất kỳ trình xử lý sự kiện nào của phần tử con và phần tử con này."làm sạch các ràng buộc DOM" có thể tham chiếu đến các sự kiện được liên kết với 'window' hoặc' document', hoặc các phần tử được lưu trong bộ nhớ và được thêm vào/loại bỏ khỏi dom (có thể sử dụng 'append' và' detach') –

+5

cả hai câu trả lời một phần chính xác: Các cuộc gọi góc loại bỏ, nhưng điều đó sẽ chỉ hủy đăng ký các sự kiện đã đăng ký với phần tử mà chỉ thị được bật và các hậu duệ của nó. Nếu bạn đã đăng ký một trình xử lý sự kiện cho một nút bên ngoài (nói tài liệu cho exemple), nó sẽ không được làm sạch. Cùng đi với các yếu tố DOM được tách ra tạo thành cây DOM trong khi phá hủy $ – BiAiB