AngularJS - механика $scope.$ Watch - это просто паттерн наблюдателя?

У меня есть фабрика:

.factory("someFactory", function() {

  var someFactory = {};

  someFactory.objects = [
    { name: "obj1" },
    { name: "obj2" }
  ];

  return someFactory;
}

И какой-то контроллер, который следит за изменениями имен объектов этой фабрики:

.controller("someController", ["someFactory", "$scope", function($scope, someFactory) {

  for (var i = someFactory.values.length - 1; i >= 0; i--) {
    $scope.$watch("someFactory.values[" + i + "].name", function(newVal, oldVal, scope) {
        if(newVal !== undefined) {
            // do something
        }
  });

}]);

Я был удивлен, что это действительно работает, и мне не нужно писать код для каждого объекта на моей фабрике отдельно. Я предполагаю, что удивлен из-за моего непонимания того, что фактически делает $scope.$ Watch. Если кто-то спросит меня, я скажу ему, что это как добрый старый наблюдатель. Это будет подходящим объяснением?

1 ответ

Решение

Это не шаблон наблюдателя. При использовании схемы наблюдателя наблюдаемый объект явно уведомляет своих наблюдателей об изменении.

Механизм наблюдения AngularJS сравнивает результат оценки выражения до и после обработки события, и, если значение выражения изменилось, он уведомляет наблюдателей. Если выполнение наблюдателя вызывает повторное изменение значения выражения, наблюдатель вызывается снова и т. Д. И т. Д., Пока не будет достигнут предел в 10 циклов.

Это объясняется в документации $scope.

Другие вопросы по тегам