如何在AngularJS中进行绑定和消化?

mat*_*sko 76 angularjs

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

但这有多自动?有时,Angular不会接受更改,所以我需要调用$ scope.$ apply()或$ scope.$ digest()来通知angular拾取更改.有时,当我运行这些方法中的任何一个时,它会抛出一个错误,并表示摘要已在进行中.

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

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

Art*_*eev 64

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

  1. 用户与HTML输入的交互('text','number','url','email','radio','checkbox').AngularJS有inputDirective.'text','number','url'和'email'输入绑定"input"或"keydown"事件的侦听器处理程序.监听器处理程序调用范围.$ apply.'radio'和'checkbox'为click事件绑定类似的处理程序.
  2. 用户与select元素的交互.AngularJS 在"change"事件中具有类似行为的selectDirective.
  3. 使用$ timeout服务进行定期更改,同时执行$ rootScope.$ apply().
  4. eventDirectives(ngClick等)也使用范围.$ apply.
  5. $ http也使用$ rootScope.$ apply().
  6. AngularJS世界之外的变化应该使用范围.$ apply如您所知.

  • +1的点"5. $ http也使用$ rootScope.$ apply()." 哎呀.有谁知道他们为什么这样做?这很烦人...... (2认同)

dai*_*ain 5

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

Miško的解释非常彻底,但缺少的是Angular正试图让$ scope在其自身的上下文中发生任何事情时回到一个明确的内部状态.这可能需要在模型状态之间蹦蹦跳跳,这也是为什么你不能仅仅依赖于$ watch()只能触发一次,以及为什么你应该小心手动设置模型之间的关系,否则你最终会无休止地圆形刷新.