在我永无休止地追求以“正确的”角度方式做事的过程中,我阅读了很多有关如何让控制器观察角度服务中保存的模型变化的文章。
一些网站 http://www.benlesh.com/2013/08/angularjs-watch-digest-and-apply-oh-my.html说在控制器上使用 $watch 是绝对错误的:
不要在控制器中使用 $watch。几乎在所有情况下都很难测试并且完全没有必要。使用范围上的方法来更新手表正在更改的值。
Others http://angular-tips.com/blog/2013/08/removing-the-unneeded-watches/只要你自己清理干净就可以了:
$watch 函数本身返回一个函数,该函数在调用时将解除 $watch 的绑定。因此,当不再需要 $watch 时,我们只需调用 $watch 返回的函数即可。
有所以问题 https://stackoverflow.com/questions/15911014/watching-a-values-in-a-service-from-a-controller and 其他信誉良好的网站 https://github.com/angular/angular.js/wiki/Best-Practices这似乎表明,在控制器中使用 $watch 是注意到角度服务维护模型中变化的好方法。
The https://github.com/angular/angular.js/wiki/Best-Practices https://github.com/angular/angular.js/wiki/Best-Practices我认为我们可以给予更多重视的网站,直接表示 $scope.$watch 应该取代对事件的需求。然而,对于处理超过 100 个模型和 REST 端点的复杂 SPA,选择使用 $watch 来避免事件$broadcast/$emit
最终可能是lots手表。另一方面,如果我们不使用 $watch,对于不平凡的应用程序,我们最终会得到大量的事件意大利面条。
这是双输的情况吗?赛事与腕表的选择是否错误?我知道您可以在很多情况下使用 2 向绑定,但有时您只是need一种倾听变化的方式。
EDIT
Ilan Frumer 的评论让我重新思考我的问题,所以也许不只是问在控制器中使用 $watch 主观上是好还是坏,让我这样提出问题:
哪种实现可能首先造成性能瓶颈?让控制器监听事件(必须已广播/发出),或设置$watch
-es 在控制器中。请记住,大型应用程序。
哪种实现首先会造成维护难题:$watch
-es 或事件?可以说,无论哪种方式都存在耦合(紧/松)......事件观察者需要知道要监听什么,并且$watch
-es 外部值(例如MyDataService.getAccountNumber()
)两者都需要了解在其 $ 范围之外发生的事情。
**一年多后编辑**
自从我问这个问题以来,Angular 已经改变/改进了很多,但我仍然得到+1,所以我想我会提到,在查看 Angular 团队的代码时,我看到了控制器中观察者的模式(或存在被破坏范围的指令):
$scope.$on('$destroy', $scope.$watch('scopeVariable', functionIWantToCall));
$watch 函数返回的是什么 - 可以调用该函数来取消注册观察程序 - 并在控制器被销毁时将其提供给事件处理程序。这会自动清理观察者。
无论控制器中的手表是否有代码味道,如果你使用它们,我相信 Angular 团队对这种模式的使用应该作为强烈推荐how使用它们。
Thanks!