$ watch是在init之后直接触发的,为什么?

时间:2013-04-08 08:59:43

标签: angularjs

为什么$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);
}

3 个答案:

答案 0 :(得分:50)

首次运行时,两个值(newValueoldValue)相等,因此您可以通过检查相等性来轻松转义它:

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

PLUNKER

答案 1 :(得分:1)

将$ watch功能包装到角度就绪功能中。

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

当角度加载页面时。它会更改值并触发$ watch。

答案 2 :(得分:0)

这里已经有了一个非常好的讨论:

How do I ignore the initial load when watching model changes in AngularJS?

  

$ scope。$ watch('fieldcontainer',function(new_fieldcontainer,old_fieldcontainer){

     

if(typeof old_fieldcontainer ==='undefined')return;

     

//此处处理更改对象的其他代码。

     

});