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.