Javascript ng斗篷是如何工作的?

Javascript ng斗篷是如何工作的?,javascript,angularjs,Javascript,Angularjs,我一直在看ng斗篷的源代码 它看起来像是在指令的编译阶段剥离了ng-clope属性。但是当我尝试的时候 console.log(element.html()) 在指令的编译函数期间,表达式仍然没有被计算,因此我得到了如下输出 <my-directive ng-cloak> {{foo}} </my-directive> {{foo} 假设ng斗篷将删除ng斗篷属性和相应的display:none,它不会显示{{foo}}吗?我在这里感到困惑。什么时候计算角度表达式

我一直在看ng斗篷的源代码

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

console.log(element.html())
在指令的编译函数期间,表达式仍然没有被计算,因此我得到了如下输出

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

假设ng斗篷将删除ng斗篷属性和相应的display:none,它不会显示{{foo}}吗?我在这里感到困惑。什么时候计算角度表达式?它看起来不像是在编译函数中进行计算的。DOM何时更新?

ngclope指令用于防止浏览器在加载应用程序时以原始(未编译)形式短暂显示角度html模板。使用此指令可避免由html模板显示引起的不良闪烁效果

该指令可以应用于元素,但首选用法是将多个ngclope指令应用于页面的小部分,以允许渐进呈现浏览器视图

NgClope与angular.js和angular.min.js中嵌入的以下css规则协同工作。对于CSP模式,请将angular-CSP.css添加到html文件(请参阅ngCsp)

示例index.html

<div id="template1" ng-cloak>{{ 'hello' }}</div>
<div id="template2" class="ng-cloak">{{ 'world' }}</div>
或者你可以用另一种方式 添加显示可能不够:无;你的CSS规则。如果要在正文中加载angular.js或模板编译不够快,请使用ng-斗篷指令,并在CSS中包含以下内容:

[ng\:cloak], [ng-cloak], .ng-cloak {
 display: none !important;}

Angular将在
$digest
周期结束时插入绑定,以便所有其他修改都已完成。如果它们在较早的时候被处理,那么一个指令可能会在稍后更改绑定或作用域,并导致DOM过期

您可以装饰
$interpolate
服务,以便在角度插值绑定时记录:

.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


ng斗篷还修复了ng click reverse的两次单击错误。一旦列出,此指令将修复带有ng click reverse的按钮的问题。指令需要两次单击才能执行

.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;
    });
})