2013-04-08 31 views
31

爲什麼$watch在頁面加載後直接觸發,我該如何防止?

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

如果您有一個控制器或指令是在頁面加載後一段時間啓動的,則也是如此。 – Andrew 2014-08-27 06:48:59

回答

49

在第一次運行兩個值(newValueoldValue)是相等的,所以你可以很容易地通過檢查平等逃避它:

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

PLUNKER

+1

啊,謝謝!但我真的可以用===比較這兩個對象,不應該使用下劃線的_.isEqual(newValue,oldValue)之類的東西嗎? – tidelipop 2013-04-08 11:30:48

+3

'angular.equals'是否適合你。 – Stewie 2013-04-08 12:15:21

+0

也許,但我已經使用下劃線,所以我用它來代替它,它運行得很好。 – tidelipop 2013-04-10 21:59:29

1

將$ watch功能包裝爲角度準備功能。

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

當角加載頁面。它會更改值並觸發$ watch。

相關問題