我一直在看ng-cloak源代码

https://github.com/angular/angular.js/blob/master/src/ng/directive/ngCloak.js

看起来它在指令的编译阶段剥离了ng-cloak属性。但是当我尝试

console.log(element.html())


在指令的编译功能期间,表达式仍未求值,因此我得到如下输出

<my-directive ng-cloak> {{foo}} </my-directive>


鉴于ng-cloak将删除ng-cloak属性和相应的display:none,它不会显示{{foo}}吗?我在这里很困惑。何时对Angular表达式求值?它看起来好像没有在编译功能中得到评估。 DOM何时更新?

最佳答案

Angular将在$digest循环结束时对绑定进行插值,以便所有其他修改都已完成。如果较早处理它们,则指令可能会在以后更改绑定或范围,并导致DOM过时。

您可以修饰$interpolate服务,以便可以在Angular插入绑定时进行记录:

.config(function($provide){
    $provide.decorator("$interpolate", function($delegate){
      function wrap() {
        var x = $delegate.apply(this, arguments);
        if (x) {
          var binding = arguments[0];
          return function() {
            var result = x.apply(this, arguments);
            console.log('binding:', binding, result);
            return result;
          }
        }
      }
      angular.extend(wrap, $delegate);
      return wrap;
    });
})


然后,您可以看到所有指令均已处理,最后,调用$ interpolate服务,并相应地修改了DOM。

Click here for live demo.

关于javascript - ng-cloak如何运作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33336338/

10-09 22:00