如何正确使用ng-cloak指令?
不知何故,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>
从这里添加这个CSS
[ng\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], .ng-cloak, .x-ng-cloak { display: none !important; }
并使用您的父div的类名称或属性或您已定义您的应用程序的任何地方。
例如:
<div ng-app="Random" class="ng-cloak"> </div>
从Angular文档 :
为了获得最好的结果,
angular.js
脚本必须加载到html文档的head部分; 或者,上面的CSS规则必须包含在应用程序的外部样式表中。
你必须在CSS中指定这些规则:
[ng\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], .ng-cloak, .x-ng-cloak { display: none !important; }
在你的css文件中添加如下内容:
[ng\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], .ng-cloak, .x-ng-cloak { display: none !important; }
使用ngBind也应该消除(我有时在SharePoint中开发,ngCloak将无法正常工作)。
AngularJS文件:
如果在Angular编译之前浏览器在原始状态下暂时显示模板,则最好使用ngBind代替{{expression式}}。 由于ngBind是一个元素属性,因此在页面加载时,绑定对用户是不可见的。
这个问题的另一种解决scheme是使用ngCloak指令。
JS:
var app = angular.module('test', []); app.controller('testCtrl', ['$scope', function($scope) { $scope.test = "Hello World"; }]);
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>
我的解决scheme,我认为我尝试了以上所有build议,但没有奏效。 有些使用ng-include,但似乎有点多,进一步它可能会被创build的内部范围可怕。 所以它试图通过使用风格和ng样式。 在我受影响的主要股利
<div class="container" style="display:hidden;" ng-style="loaded">
然后我设置范围variables加载在我的基地控制器。
$ scope.loaded = {display:'block'};
仍然有所有这些{{}}。 奇怪,当显示设置为只有当angularjs已经加载阻止。 然后我注意到我的firefox f12开发者控制台正在运行 。 它做的东西。 愚蠢的我
从1.3angular度起,你必须指定一个ng-app属性的名称才能工作。
<html lang="en" ng-app="myApp">
在你的JS:
angular.module("myApp",[])
这将使angular度bootstrap。
但是对于目前的情况,当你在页面底部加载angular度时,需要花费时间来加载。 所以ng-cloak
所需的css还不可用。
要么将js
移动到标签,要么将特定的CSS代码加载到CSS中以使其工作。
[ng\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], .ng-cloak, .x-ng-cloak { display: none !important; }
就我而言,我认为我的麻烦是等待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); } }; }]);
有了一点CSS:
[ajax-cloak], [data-ajax-cloak], [x-ajax-cloak], .ajax-cloak { display: none !important; }
然后在你的主HTML文件中:
<div ui-view data-ajax-cloak></div>
注意:这不像ng-cloak那么复杂,因为这是一个全局性的东西,它隐藏了一切,直到所有的请求都完成了。
我已经尝试了上述所有的答案,超出了很多,没有任何帮助。 我的(大)页面会在每个负载上闪烁。 我的解决scheme是在body标签之后添加这个:
<div style="display:flex" opacity=0> <status-progress></status-progress> <h3>Loading... </h3> </div>
并在页面中包装所有内容:
<div class="loaded" style="opacity: 0" opacity=1> ... </div>
指示:
app.directive('opacity', opacity); function opacity($timeout) { return { link: function (scope, element, attrs) { var value = attrs.opacity; $timeout(function () { element[0].style.opacity = value; },500); } } }
为了使页面看起来更“stream畅”,样式表:
.loaded{ transition: opacity 1s ease-in-out; -webkit-transition: opacity 1s ease-in-out; -moz-transition: opacity 1s ease-in-out; }
这样,你看到“加载”1秒,而一切都准备就绪。
由于这些答案都没有给出我想要的结果,所以我通过创build一个非常类似于ng-cloak
的指令来实现我想要的,但是将代码封装在$timeout
以便它等到$digest
循环结束以删除隐藏属性和/或类。 这是我真正能够在浏览器中隐藏{{}}
绑定的唯一方法。
angular.directive('myCloak', function($timeout) { return { restrict: 'A', compile: function (element, attr) { $timeout(function () { attr.$set('myCloak', undefined); element.removeClass('my-cloak'); }); } }; });
不要忘记,你将不得不为这个新的属性/类添加一个自定义的CSS规则:
[my\:cloak], [my-cloak], [data-my-cloak], [x-my-cloak], .my-cloak, .x-my-cloak { display: none !important; }
使用这里推荐的修补程序适用于我…
https://github.com/opitzconsulting/jquery-mobile-angular-adapter/issues/167
CSS:
.my-cloak { display: none !important; }
JS:
$scope.$on('$viewContentLoaded', function(){ $('.my-cloak').removeClass('my-cloak'); });
HTML:
div(class="my-cloak")
当ng-cloak不可用时使用ngBind。
<p ng-show="!isShow" ng-bind="isShow"></p>