$watch vs. ngChange
$watch vs. ngChange
假设你想在属性 $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?
- 效率低下 - 增加$digest的复杂性
- 很难有效测试
- 它不干净
你说得对。 ng-change
非常特定于 DOM,用于在 DOM 元素上触发更改事件时计算表达式。
但是,$watch
是一个较低级别(也是更通用(的实用程序,用于监视视图模型或$scope
。因此,每次用户键入键(在输入示例中(时,都会触发监视函数。
因此,相比之下,一个侦听 DOM 事件,另一个监视您的数据。
$watch增加了$digest的复杂性,使其效率降低。在您的情况下 ngChange 这是一个更干净、更简单的解决方案......
字体:http://www.benlesh.com/2013/10/title.html
- setInteval vs setTimeout
- $(this).prop('property') vs. this.property
- Js.erb VS按钮标记-不'不起作用.为什么?
- reactjs this.refs vs document.getElementById
- Performance: NaCl vs Emscripten
- 文本表示法VS.构造函数,用于在JavaScript中创建对象
- Advantages to DOMParser vs template & innerHTML
- JavaScript-===vs===运算符性能
- 开发第三方小部件-Angular vs jQuery vs普通的旧JS
- PhantomJS(vs nightwatch.js)设置cookie错误
- Javascript events: window.event vs argument reference (funct
- 需要确认我对Servlet vs RESTful网页的理解's的差异
- "#"keyCode=222 vs 51(Chrome与Android版Chrome)-为什么有区别
- .notion vs.[]notation |插入到文本对象中
- Javascript-使用“”将toDateStringMonth从文本字符串解析为数字字符串;如果“;vs“;开关”;
- 没有框架/DLL的VS Web应用程序项目
- Eval vs execscript
- VS代码:在<脚本>标签
- Object.prototype.hasOwnProperty.call() vs Object.prototype.h
- $watch vs. ngChange