为什么 Angular 摘要循环没有被调用?

Why is the Angular Digest Cycle not being called?

我有两个控制器和一个工厂。我正在将工厂和控制器注入主控制器,下面是代码片段:

工厂:

app.factory('TallyFactory', function(){

  return {
    correct: 0,
    incorrect: 0
  };

});

接受 TallyFactory 的 TallyController:

app.controller('TallyController', function($scope, TallyFactory){    

  $scope.$watch('scores', function(newValue, oldValue){
    console.info('changed!');
    console.log('Old: ' + JSON.stringify(oldValue));
    console.log('New: ' + JSON.stringify(newValue));
  });

  $scope.scores = TallyFactory;
});

MainController 接受 TallyFactory 并更改 TallyFactory 对象的值:

app.controller('MainController', function ($scope,TallyFactory) {

    $scope.addTally = function(){
    TallyFactory.correct++;
  }
});

注意在我的 TallyController(第二个片段)中,我向 $scope 添加了一个观察者,监听何时 "scores" 发生变化。

当我使用 ng-click 从我的 MainController 运行 "addTally" 函数时,它会更改我的工厂对象 (TallyFactory) 的值。由于发生了变化,并且我专门在我的 TallyController ($scope.scores) 上创建了一个观察者,难道不应该触发摘要周期并且我的控制台更新为我的 TallyFactory 的新值吗?

另外,我的 TallyController 没有嵌套在我的 MainController 中,它们彼此分开(不是 100% 确定这是否重要)。

我不确定为什么在 TallyFactory 更改值后没有触发摘要循环。

$scope.$watch('scores.correct', function(newValue, oldValue){ ... });

关注特定 属性。并且

$scope.$watchCollection('scores', function(newValue, oldValue){ ... });

关注他们所有人。

考虑使用深度 $watch

$scope.$watch('scores', function(newValue, oldValue){ ... }, true);

相反,如果 scores 属性可能包含对象。

与深度 $watch 相比,$watchCollection 即使对于简单的浅层对象也提供了显着的性能提升。这是 $watchCollection:

的分析器时间线

虽然 deep $watch 探查器时间轴将如下所示:

我对答案的确切正确性有些怀疑,但在将您的代码复制到一个可以是 运行 的片段后,我刚刚在这里验证了 estus 的答案是可以接受的。

angular.module('app', [])

.controller('TallyController', function($scope, TallyFactory){    
  $scope.scores = TallyFactory;
  
  $scope.$watch('scores', function(newValue, oldValue){
    alert('changed!');
    console.log('Old: ' + JSON.stringify(oldValue));
    console.log('New: ' + JSON.stringify(newValue));
  }, true);
})


.factory('TallyFactory', function(){

  return {
    correct: 0,
    incorrect: 0
  };

})

.controller('MainController', function ($scope,TallyFactory) {

    $scope.addTally = function(){
    TallyFactory.correct++;
  }
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js"></script>


<div ng-app='app'>

  
  <div ng-controller="TallyController">
    {{scores}}
  </div>
  <div ng-controller="MainController">
    <button ng-click="addTally()">Add Tally</button>
  </div>
  
  
  
</div>