2013-03-17 28 views
18

Giả sử tôi có bộ điều khiển cho trang đang được hiển thị thành ng-view.

Bộ điều khiển này liên kết với một số sự kiện của nguồn bên ngoài (chẳng hạn như một bus thông báo ứng dụng) để cập nhật mô hình của nó. Điều này về cơ bản hoạt động rất dễ dàng:

function MyController ($scope) { 
    $scope.bar = '…'; 

    externalSource.on('foo', function (data) { 
    $scope.$apply(function() { 
     $scope.bar = data.bar; 
    }); 
    }); 
} 

Vấn đề là: Làm cách nào để bỏ bộ điều khiển khỏi nguồn bên ngoài khi chế độ xem nó được liên kết không còn hiển thị?

Có điều gì đó như sự kiện dispose hoặc sự kiện tương tự không?

Hoặc là cách tiếp cận của tôi hoàn toàn sai, và tôi nên đối phó với một cái gì đó như thế bằng cách nào đó khác? Nếu vậy, làm thế nào?

+0

Trong trường hợp bạn sử dụng jQuerys ** trên phương thức ('event', ...) **, bạn có thể chỉ cần gọi ** off ('event') ** để xóa sự kiện. Hay tôi đã sai bạn? –

+0

Đây không phải là câu hỏi về góc cạnh cụ thể. Nó phụ thuộc vào tài nguyên sự kiện bên ngoài bạn đang sử dụng. –

+3

Vâng. Tôi biết làm thế nào để unbind, nhưng tôi không biết khi nào/nơi để làm điều đó. Điều này phụ thuộc vào vòng đời của bộ điều khiển, và điều này chắc chắn có liên quan đến AngularJS. –

Trả lời

35

Để thực hiện sự kiện unbind sử dụng khi phạm vi điều khiển được đã bị phá hủy:

$scope.$on('$destroy', function() { /* Unbind code here */ });

Xem Scope tài liệu để biết thêm thông tin

+2

Tôi nghĩ bạn có nghĩa là '$ scope. $ On ('$ destroy', function() {...})' –

+0

@Mark Rajcok Thật vậy, cảm ơn bạn –

3

Sử dụng $ routeChangeStart hoặc $ routeChangeSuccess sự kiện:

function MyController ($scope) { 
    $scope.bar = '…'; 

    externalSource.on('foo', function (data) { 
    $scope.$apply(function() { 
     $scope.bar = data.bar; 
    }); 
    }); 

    $scope.$on('$routeChangeStart', function(next, current){ 
    // unregister listener 
    // externalSource.off .... 
    }); 
} 

... hoặc $destroy sự kiện:

$scope.$on('$destroy', function(){ 
    // unregister listener 
    // externalSource.off .... 
    }); 
Các vấn đề liên quan