我有一些工厂:
.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的实际缺乏了解.如果有人问我,我会告诉他这就像是观察者的好模式.这是一个合适的解释吗?
解决方法
这不是观察者模式.使用观察者模式,观察对象在其变化时明确地通知其观察者.
AngularJS监视机制比较处理事件之前和之后表达式的评估结果,如果表达式的值发生了变化,它会通知观察者.如果观察者执行导致再次改变表达值,则再次调用观察者等,直到达到10个周期的限制.
这在$scope documentation中有解释.