绑定和摘要在AngularJS中如何工作?


76

使AngularJS与其他JavaScript-MVC框架区分开的一件事是,它能够使用绑定将JavaScript中的绑定值回传到HTML。当您为$ scope变量分配任何值时,Angular会“自动”执行此操作。

但是,这有多自动化?有时,Angular不会接受更改,因此我需要调用$ scope。$ apply()或$ scope。$ digest()来通知angular来获取更改。有时,当我运行这些方法中的任何一个时,都会引发错误并指出摘要已在进行中。

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

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


5
我发现docs.angularjs.org/guide/concepts#runtime中以“这是Hello World示例如何实现数据绑定效果的解释”开头的部分很有帮助。
Mark Rajcok 2012年

3
这篇文章也是有用的,如果你没有看到它:stackoverflow.com/questions/9682092/databinding-in-angularjs/...
Gloopy

评论您的第一个声明性段落:Angular的“使用绑定将绑定的值从JavaScript回显到HTML的能力”听起来像是一种令人困惑的说法“数据绑定”。在这一点上,它并没有真正使Angular与Ember或React等其他框架区分开。这个问题很有用,请不要误解我的意思。但是第一段只是我不同意的一种观点,我会编辑问题,但我觉得不够权威。
豪尔赫·奥皮内尔

Answers:


64

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

  1. 用户与HTML输入(“文本”“数字”“ URL”“电子邮件”“无线电”“复选框”)的交互。AngularJS具有inputDirective。“文本”,“数字”,“ URL”和“电子邮件”输入为“输入”或“按键按下”事件绑定侦听器处理程序。侦听器处理程序调用scope。$ apply。'radio'和'checkbox'为click事件绑定了类似的处理程序。
  2. 用户与选择元素的交互。AngularJS的selectDirective在'change'事件上具有类似的行为。
  3. 使用$ timeout服务的定期更改也可以执行$ rootScope。$ apply()
  4. eventDirectives(ngClick等)也使用scope。$ apply
  5. $ http还使用$ rootScope。$ apply()
  6. 众所周知,AngularJS之外的更改应使用scope。$ apply。

2
对于点“ 5. +1。$ http还使用$ rootScope。$ apply()”。啊 有人知道为什么要这么做吗?这非常令人讨厌……
gecco

5

如您所知,它不是轮询,而是使用它的内部执行循环,因此这就是为什么您需要使用$ apply()或$ digest()使事情开始的原因。

Miško的解释很彻底,但是缺少的一点是,只要在自己的上下文中发生任何事情,Angular都试图使$ scope返回清晰的内部状态。这可能会在模型状态之间发生一些反弹,所以这也是为什么您不能仅依靠$ watch()触发一次的原因,也是为什么您应该谨慎手动设置模型之间的关系,否则最终会陷入无尽的困境的原因。循环刷新。


那么$ apply(someFn)如何工作?在执行apply迭代时,是否会执行someFn的内容?
matsko 2012年

随着$应用代码获取的角度范围,这仅仅是通知其要被消化的变化,看到执行:docs.angularjs.org/api/ng.$ro​​otScope.Scope#$apply
岱恩

如果您想避免与$ digest发生冲突,则必须检查$ phase:groups.google.com/d/msg/angular/FJwxJ-XbJaE/1NavZNQBhf4J
dain 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.