如何正确使用ng-cloak指令?

Kot*_*aro 66 javascript angularjs angularjs-directive ngcloak

不知何故,AngularJS中的ng-cloak不起作用.我想在加载页面时隐藏{{}}.因为它看起来很糟糕.

<!DOCTYPE html>
<html lang="en" ng-app>
    <head>
        <meta charset="UTF-8">
        <title>Angular Sample</title>
    </head>
    <body ng-model="isShow" ng-init="isShow=true">

        <p ng-show="isShow"><span ng-cloak>{{ isShow }}</span></p>
        <p ng-show="!isShow"><span ng-cloak>{{ isShow }}</span></p>

        <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js"></script>
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

Yas*_*ser 105

这里添加这个css

[ng\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], .ng-cloak, .x-ng-cloak {
  display: none !important;
}
Run Code Online (Sandbox Code Playgroud)

并使用父div上的类名或属性或您定义应用程序的任何位置.

例如:

<div ng-app="Random" class="ng-cloak">
</div>
Run Code Online (Sandbox Code Playgroud)

  • (来自@ GregL的doc链接),关于WHY的更多信息:OP代码的问题是代码在页面加载结束时加载angular.min.js,因此HTML(Angular模板)在之前呈现ng-cloak被定义.在这里添加css规则引用只需在<head>中定义角度自己的ng-cloak样式,即使在页面加载时立即加载Angular.min.js之前也是如此,即使你没有加载角度直到HTML的结尾.Doc建议在<head>中加载angular.js以避免/最小化此问题. (4认同)
  • 我希望SO上的所有答案都是这样:) (2认同)
  • @Cemre它将`display:none`属性添加到ng-cloak类和指令的所有变体中.此类将在应用程序的加载时间内处于活动状态,因此此css可确保不显示具有此类的元素. (2认同)

Gre*_*egL 31

来自Angular文档:

为了获得最佳结果,angular.js脚本必须加载到html文档的head部分; 或者,上面的css规则必须包含在应用程序的外部样式表中.


m0m*_*eni 10

您必须在CSS中指定这些规则:

[ng\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], .ng-cloak, .x-ng-cloak {
  display: none !important;
}
Run Code Online (Sandbox Code Playgroud)


ken*_*how 9

使用ngBind也应该消除它(我有时在SharePoint中开发并且ngCloak不起作用).

AngularJS文档:

如果在Angular编译它之前浏览器在其原始状态下暂时显示模板,则最好使用ngBind而不是{{expression}}.由于ngBind是一个元素属性,因此在加载页面时,它会使绑定对用户不可见.

该问题的另一种解决方案是使用ngCloak指令.

JS:

var app = angular.module('test', []);

app.controller('testCtrl', ['$scope', function($scope) {
  $scope.test = "Hello World";
}]);
Run Code Online (Sandbox Code Playgroud)

HTML:

<html ng-app="test">

<head>
  <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
  <script src="script.js"></script>
</head>

<body ng-controller="testCtrl">
  <h1 ng-bind="test"></h1>
</body>

</html>
Run Code Online (Sandbox Code Playgroud)


squ*_*oid 8

在您的css文件中添加以下内容: -

[ng\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], .ng-cloak, .x-ng-cloak {
  display: none !important;
}
Run Code Online (Sandbox Code Playgroud)


Rol*_*our 6

就我而言,我认为我的麻烦是等待ajax请求的.Ng-cloak可能适用于静态内容,但如果模板依赖于ajax数据,则在接收ajax响应之前将其呈现.

为了避免它,我定义了一个指令:

安固

mymodule
        .directive("ajaxCloak", ['$interval', '$http', function ($interval, $http) {
            return {
                restrict: 'A',
                link: function (scope, element, attrs) {
                    let stop = $interval(() => {
                        if ($http.pendingRequests.length === 0) {
                            $interval.cancel(stop);
                            attrs.$set("ajaxCloak", undefined);
                            element.removeClass("ajax-cloak");
                        }
                    }, 100);

                }
            };
        }]);
Run Code Online (Sandbox Code Playgroud)

有点CSS:

[ajax-cloak], [data-ajax-cloak], [x-ajax-cloak], .ajax-cloak {
  display: none !important;
}
Run Code Online (Sandbox Code Playgroud)

然后在您的主HTML文件中:

<div ui-view data-ajax-cloak></div>
Run Code Online (Sandbox Code Playgroud)

注意:这不像ng-cloak那样复杂,因为它是一个全局的cloack,它会隐藏所有请求,直到所有请求都完成.


Jen*_*ius 5

我的解决方案我认为我尝试了以上所有建议,但没有任何效果.有些人使用ng-include但似乎有点太多了,进一步说它可能会对创建的内部范围感到害怕.所以它尝试使用样式和ng风格.在我受影响的主要div.

<div class="container" style="display:hidden;" ng-style="loaded">
Run Code Online (Sandbox Code Playgroud)

然后我设置在我的基本控制器中加载的范围变量.

$scope.loaded ={display:'block'};

仍然得到了所有{{}}.当显示设置仅在angularjs加载时阻止时很奇怪.然后我注意到我运行了firefox f12开发人员控制台.它做的东西.愚蠢的我