Câu trả lời của @ LiviuT là tuyệt vời, nhưng dường như khiến nhiều người thắc mắc làm thế nào để truy cập lại chức năng xé của trình xử lý từ một phạm vi hoặc hàm $ khác, nếu bạn muốn phá hủy nó từ một nơi khác ngoài nơi nó được tạo. @ Câu trả lời của Мусабеков chỉ hoạt động tuyệt vời, nhưng không phải là rất thành ngữ. (Và dựa vào những gì được coi là một chi tiết triển khai riêng tư, có thể thay đổi bất cứ lúc nào.) Và từ đó, nó trở nên phức tạp hơn ...
Tôi nghĩ rằng câu trả lời dễ dàng ở đây chỉ đơn giản là mang một tham chiếu đến hàm xé ( offCallMeFn
trong ví dụ của anh ta) trong chính trình xử lý, và sau đó gọi nó dựa trên một số điều kiện; có lẽ là một đối số mà bạn đưa vào sự kiện bạn $ phát sóng hoặc $ phát ra. Người xử lý có thể tự xé nát mình, bất cứ khi nào bạn muốn, bất cứ nơi nào bạn muốn, mang theo những hạt giống hủy diệt của chính họ. Thích như vậy:
// Creation of our handler:
var tearDownFunc = $rootScope.$on('demo-event', function(event, booleanParam) {
var selfDestruct = tearDownFunc;
if (booleanParam === false) {
console.log('This is the routine handler here. I can do your normal handling-type stuff.')
}
if (booleanParam === true) {
console.log("5... 4... 3... 2... 1...")
selfDestruct();
}
});
// These two functions are purely for demonstration
window.trigger = function(booleanArg) {
$scope.$emit('demo-event', booleanArg);
}
window.check = function() {
// shows us where Angular is stashing our handlers, while they exist
console.log($rootScope.$$listeners['demo-event'])
};
// Interactive Demo:
>> trigger(false);
// "This is the routine handler here. I can do your normal handling-type stuff."
>> check();
// [function] (So, there's a handler registered at this point.)
>> trigger(true);
// "5... 4... 3... 2... 1..."
>> check();
// [null] (No more handler.)
>> trigger(false);
// undefined (He's dead, Jim.)
Hai suy nghĩ:
- Đây là một công thức tuyệt vời cho một trình xử lý một lần chạy. Chỉ cần bỏ các điều kiện và chạy
selfDestruct
ngay khi nó đã hoàn thành nhiệm vụ tự sát.
- Tôi tự hỏi về việc liệu phạm vi khởi tạo sẽ bị phá hủy và thu gom rác đúng cách hay không, cho rằng bạn đang mang các tham chiếu đến các biến được đóng. Bạn sẽ phải sử dụng một triệu trong số này để thậm chí có vấn đề về bộ nhớ, nhưng tôi tò mò. Nếu ai có cái nhìn sâu sắc, xin vui lòng chia sẻ.