$watch vs. ngChange

$watch vs. ngChange

本文关键字:ngChange vs watch      更新时间:2023-09-26

假设你想在属性 $scope 发生变化时做某事。并假设此属性绑定到input字段。使用$watch与使用ngChange的优点/缺点是什么?

.html

<input ng-model="foo" ng-change="increment()">
<p>foo: {{foo}}</p>
<!-- I want to do something when foo changes.
     In this case keep track of the number of changes. -->
<p>fooChangeCount: {{fooChangeCount}}</p>

.js

// Option 1: $watch
$scope.$watch('foo', function() {
  $scope.fooChangeCount++;
});
// Option 2: ngChange
$scope.fooChangeCount = 0;
$scope.increment = function() {
  $scope.fooChangeCount++;
};

http://plnkr.co/edit/4xJWpU6AN9HIp0OSZjgm?p=preview

我知道有时您需要使用$watch(如果您要监视的值未绑定到输入字段(。而且我知道有时您需要使用ngChange(当您想做一些事情来响应输入中的更改时,但不一定是为了响应范围属性的更改(。

但是,在这种情况下,两者都完成相同的事情。

我的想法:

  • ngChange似乎更干净,更容易理解正在发生的事情。
  • $watch似乎可能稍微快一点,但可能可以忽略不计。对于ngChange,我认为 Angular 必须在编译阶段做一些额外的工作来设置事件侦听器,也许额外的事件侦听器会降低速度。无论您是否使用 ngChange ,摘要周期都会在更改时运行,因此您有机会侦听某些内容并调用函数以响应更改。

底线 - 你可以用$watch ng-change实现所有你可以实现的事情,反之则不然。

目的:

ngChange - 绑定到 HTML 元素

$watch - 观察范围的模型对象(包括 HTML 对象模型(

我的经验法则 - 如果您可以使用 ng-change,请使用它来匹配您的场景,否则请使用$watch

为什么不应该使用$watch?

  1. 效率低下 - 增加$digest的复杂性
  2. 很难有效测试
  3. 它不干净

你说得对。 ng-change非常特定于 DOM,用于在 DOM 元素上触发更改事件时计算表达式。

但是,$watch是一个较低级别(也是更通用(的实用程序,用于监视视图模型或$scope。因此,每次用户键入键(在输入示例中(时,都会触发监视函数。

因此,相比之下,一个侦听 DOM 事件,另一个监视您的数据。

$watch增加了$digest的复杂性,使其效率降低。在您的情况下 ngChange 这是一个更干净、更简单的解决方案......

字体:http://www.benlesh.com/2013/10/title.html