2013-04-08 19 views
31

Tại sao kích hoạt $watch trực tiếp sau khi tải trang và làm cách nào để ngăn chặn điều này?

http://jsfiddle.net/dcSRu/2/

function MyCtrl($scope) { 
    // Init scope vars 
    $scope.data_copy = {}; 

    // If data_copy changes... 
    $scope.$watch("data_copy", function(newValue, oldValue) { 

     alert("$watch triggered!"); 

    }, true); 
} 
+0

Đây cũng là trường hợp nếu bạn có bộ điều khiển hoặc chỉ thị được bắt đầu một thời gian sau khi tải trang. – Andrew

Trả lời

49

On chạy đầu tiên cả hai giá trị (newValueoldValue) đều bình đẳng, vì vậy bạn có thể dễ dàng thoát khỏi nó bằng cách kiểm tra bình đẳng:

$scope.$watch("data_copy", function(newValue, oldValue) { 
    if(newValue === oldValue){ 
    return; 
    } 
    alert("$watch triggered!"); 
}); 

PLUNKER

+1

Ahh, cảm ơn! Nhưng tôi thực sự có thể so sánh hai đối tượng với ===, tôi không nên sử dụng một cái gì đó như _.isEqual của underscore (newValue, oldValue)? – tidelipop

+3

Có 'angular.equals' hoạt động cho bạn không. – Stewie

+0

Có lẽ, nhưng tôi đã sử dụng gạch dưới vì vậy tôi đã sử dụng nó thay vào đó và nó hoạt động rất tốt. – tidelipop

1

Bỏ chức năng đồng hồ $ vào chức năng sẵn sàng góc.

angular.element(document).ready(function() 
{ 
    $scope.$watch("data_copy", function(newValue, oldValue) { 
    alert("$watch triggered!"); 
    }, true); 
}) 

Khi trang tải góc. Nó thay đổi giá trị và đồng hồ $ được kích hoạt.

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