Angular.js 如何处理诸如“ng-click”之类的事件绑定?
如果我使用 Chrome 开发工具检查 DOM 中的 HTML 输出,我只会看到 2 个类添加到具有“ng-click”指令、“ng-scope”和“ng-binding”的元素中。Angular 如何绑定到 DOM 来拦截这些?它是否附加到最顶层的元素,并在内存中保留一个大对象,将事件映射到它们注册到的 DOM 元素,并利用事件冒泡?或者是其他东西?
Angular.js 如何处理诸如“ng-click”之类的事件绑定?
如果我使用 Chrome 开发工具检查 DOM 中的 HTML 输出,我只会看到 2 个类添加到具有“ng-click”指令、“ng-scope”和“ng-binding”的元素中。Angular 如何绑定到 DOM 来拦截这些?它是否附加到最顶层的元素,并在内存中保留一个大对象,将事件映射到它们注册到的 DOM 元素,并利用事件冒泡?或者是其他东西?
AngularJS 会进行脏检查,每次 AngularJS 找到一个指令时,它都会设置一个 $watch 来查看更改。
$watch 列表是一组自上次迭代以来可能已更改的表达式。如果检测到更改,则调用 $watch 函数,该函数通常使用新值更新 DOM。一旦 Angular $digest 循环完成,执行就会离开 Angular 和 JavaScript 上下文。随后浏览器重新渲染 DOM 以反映任何更改。
简单地说,有一种机制可以创建一个需要绑定的指令列表,在 $digest 循环期间,如果有更改,则将检查列表是否有更改,浏览器会重新渲染 DOM,并将其反映到浏览器。
这是一个非常简短的解释,您可以在此处找到更多信息:
ng-[eventname]-directives 通过执行 a 来工作element.bind
,其中 element 是一个 jQuery/ jqLite 元素。此绑定方法通过调用 element.addEventListener(至少在 Chrome 中)来工作。通过检查 DOM,您不会看到该事件侦听器。