Some sites说在控制器上使用$ watch绝对错误:
DON’T use $watch in a controller. It’s hard to test and completely unnecessary in almost every case. Use a method on the scope to update the value(s) the watch was changing instead.
Others看起来很好,只要你自己清理:
The $watch function itself returns a function which will unbind the $watch when called. So,when the $watch is no longer needed,we simply call the function returned by $watch.
有SO questions和other reputable sites似乎说,在控制器中使用$手表是一个伟大的方式注意角度服务维护模型的变化。
https://github.com/angular/angular.js/wiki/Best-Practices网站,我认为我们可以给予更多的重量,说明了$ scope。$ watch应该替换事件的需要。然而,对于处理多达100个模型和REST端点的复杂SPA,选择使用$ watch避免使用$ broadcast / $ emit的事件可能会导致大量的手表。另一方面,如果我们不使用$ watch,对于不平凡的应用程序,我们结束了吨的事件意大利面。
这是一个输/输情况吗?这是事件和手表之间的错误选择吗?我知道你可以使用2路绑定在许多情况下,但有时你只需要一种方式来监听变化。
编辑
Ilan Frumer的评论让我重新思考我在问什么,所以也许不是仅仅问在控制器中使用$ watch是否主观上好/坏,让我以这种方式提出问题:
哪个实现可能首先创建性能瓶颈?让控制器侦听事件(必须被广播/发射),或者在控制器中设置$ watch-es。记住,大规模的应用程序。
哪个实现首先创建维护头痛:$ watch-es或events?可以说,有一个耦合(紧/松)任何一种方式…事件监视器需要知道什么,并且外部值(如MyDataService.getAccountNumber())的$ watch需要知道的事情发生之外$ scope。
**一年后编辑**
Angular已经改变/改进了很多,因为我问这个问题,但我还是得到1的,所以我想我会提到,在查看角队的代码,我看到一个模式,当涉及到观察者在控制器(或指令其中有一个范围被破坏):
$ scope。$ on(‘$ destroy’,$ scope。$ watch(‘scopeVariable’,functionIWantToCall));
这需要什么$ watch函数返回 – 一个可以被调用来注销监视器的函数 – 并将其提供给控制器销毁时的事件处理程序。这会自动清除观察者。
无论手表在控制器是否是代码气味,如果你使用它们,我相信角队使用这种模式应该作为一个强烈的建议,如何使用它们。
谢谢!
我将从我构建的应用程序中举个例子。我有一个复杂的WebSocket服务从Web套接字服务器接收动态数据模型。服务本身不关心模型看起来像什么,但是,当然,控制器确实。
当控制器启动时,它在服务数据对象上设置一个$ watch,以便它知道它的特定数据对象何时到达(例如等待Service.data.foo存在)。一旦该模型存在,能够绑定到它和crate一个双向数据绑定到它,手表变得过时,它被销毁。
另一方面,服务也负责广播某些事件,因为有时客户端将从服务器接收直接命令。例如,服务器可能请求客户端在整个应用程序中发送存储在’$ rootScope’中的一些元数据。在module.run()步骤中,在$ rootScope中设置了一个.on(),以便从服务器监听这些命令,从其他服务收集所需的信息,然后调用WebSocket服务以按请求发送数据。或者,如果我使用$ watch()这样做,我需要设置一些任意变量来观察,像MetadataRequests,我需要增量每次我收到一个请求。广播实现相同的事情,而不必住在永久记忆,像我们的变量。
基本上,我使用$ watch()当有一个特定的值,我想看到改变(特别是如果我需要知道的前后值),我使用事件,如果有更多的高级条件已经满足控制器需要知道的。
关于性能,我不能告诉你哪一个将首先瓶颈,但我觉得这样想,它将让你使用每个功能的优势,他们是最强的。例如,如果使用$ on()而不是$ watch()来查找数据中的更改,那么您将无法访问更改之前和之后的值,这可能会限制您尝试执行的操作。