绑定和消化在AngularJS中如何工作?

将AngularJS与其他JavaScript-MVC框架区分开来的一件事是它能够使用绑定将绑定值从JavaScript回显为HTML。 当你将任何值赋给$ scope变量时,Angular会自动执行此操作。

但这有多自动? 有时,Angular不会接受更改,因此我需要调用$ scope。$ apply()或$ scope。$ digest()来通知角度以获取更改。 有时当我运行这些方法时,它会抛出一个错误,并说摘要已经在进行中。

由于绑定({{}}括号或ng属性中的任何内容)都与eval一起回显,那么这是否意味着Angular不断轮询$ scope对象以查找更改,然后执行eval以将这些更改推送到DOM / HTML? 或者AngularJS以某种方式计算出使用魔术变量来触发变量值更改或分配时触发的事件? 我从来没有听说过它被所有浏览器完全支持,所以我对此表示怀疑。

AngularJS如何跟踪它的绑定和范围变量?


除了Mark发现的文档部分之外,我认为我们可以尝试列举所有可能的变化来源。

  • 用户与HTML输入('文本','数字','网址','电子邮件','收音机','复选框')的交互。 AngularJS有inputDirective。 'text','number','url'和'email'输入绑定'input'或'keydown'事件的监听器句柄。 Listener处理程序调用scope。$ apply。 'radio'和'checkbox'为点击事件绑定类似的处理器。
  • 用户与选择元素的交互。 AngularJS拥有selectDirective,在'change'事件上具有类似的行为。
  • 使用$ timeout服务进行定期更改也可以执行$ rootScope。$ apply()。
  • eventDirectives(ngClick等)也使用scope。$ apply。
  • $ http也使用$ rootScope。$ apply()。
  • AngularJS世界以外的变化应该使用范围。

  • 当你发现它不是轮询时,而是使用它的内部执行循环,这就是为什么你需要使用$ apply()或$ digest()来启动事情。

    Miško的解释非常透彻,但是缺少的一点是Angular只是试图让$ scope在它自己的上下文中发生任何事情时回到明确的内部状态。 这可能需要在模型状态之间进行一些反弹,所以这也是为什么你不能仅仅依靠$ watch()触发一次,以及为什么你应该小心手动建立模型之间的关系,否则你最终会陷入无穷无尽循环刷新。

    链接地址: http://www.djcxy.com/p/23131.html

    上一篇: how does the binding and digesting work in AngularJS?

    下一篇: Angular JS Scaling & Performance