Angularjs - ng-cloak/ng-show元素闪烁

Mel*_*sis 230 javascript class angularjs

我在angular.js中有一个带有指令/类ng-cloak或问题的问题ng-show.

Chrome工作正常,但Firefox会导致元素闪烁ng-cloakng-show.恕我直言,这是由转换ng-cloak/ ng-showstyle="display: none;",可能是Firefox javascript编译器有点慢,所以元素出现一段时间,然后隐藏?

例:

<ul ng-show="foo != null" ng-cloak>..</ul>
Run Code Online (Sandbox Code Playgroud)

Tim*_*aub 385

虽然文档没有提到它,但是将display: none;规则添加到CSS 可能还不够.如果您在正文中加载angular.js或模板未尽快编译,请使用该ng-cloak指令在CSS中包含以下内容:

/* 
  Allow angular.js to be loaded in body, hiding cloaked elements until 
  templates compile.  The !important is important given that there may be 
  other selectors that are more specific or come later and might alter display.  
 */
[ng\:cloak], [ng-cloak], .ng-cloak {
  display: none !important;
}
Run Code Online (Sandbox Code Playgroud)

正如评论中所提到的,这!important很重要.例如,如果您有以下标记

<ul class="nav">
  <li><a href="/foo" ng-cloak>{{bar}}</a></li>
</ul>
Run Code Online (Sandbox Code Playgroud)

并且您碰巧正在使用bootstrap.css,以下选择器更适合您的ng-cloak'ed元素

.nav > li > a {
  display: block;
}
Run Code Online (Sandbox Code Playgroud)

因此,如果简单地包含一个规则display: none;,Bootstrap的规则将优先,并且display将设置为block,因此您将在模板编译之前看到闪烁.

  • 不能解决我的问题.不知道 - 我认为浏览器太急于最初展示的东西...... (84认同)
  • 它现在在[文档]中(http://docs.angularjs.org/api/ng/directive/ngCloak) (8认同)
  • 浏览器不应该在不考虑css的情况下渲染DOM,即使在第一次传递时也是如此; 这将是非常低效的; 仔细检查您的设置:p (7认同)
  • 另请注意,如果使用异步加载程序(例如require.js)加载angular.js,则会发生同样的问题,因为.js中的css规则不会及时解析.上面的解决方案也修复了这种情况. (3认同)

btf*_*ord 47

文档中所述,您应该向CSS添加规则以根据ng-cloak属性隐藏它:

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

我们在"Built with Angular"网站上使用类似的技巧,您可以在Github上查看源代码:https://github.com/angular/builtwith.angularjs.org

希望有所帮助!

  • 文档中真正提到的是:"为了获得最佳结果,必须在html文件的head部分加载angular.js脚本;**或者**,css规则(上面)必须包含在应用程序的外部样式表." (12认同)
  • angular.js将该样式规则添加到文档的头部.你真的不需要将它添加到你的CSS.这就是说,这似乎有效.我的猜测是因为在加载角度之后,angular.js不会将样式块添加到头部. (4认同)
  • 换句话说,如果您在页面底部添加脚本引用(正如许多人所做的那样); 然后将规则添加到CSS. (4认同)

And*_*yuk 32

确保AngularJS包含在headHTML中.请参阅ngCloak doc:

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

  • 是!我无法理解为什么世界各地的人似乎都建议在页面末尾加载angular.js.如果Angular从一开始就控制好,我感觉好多了.我的'ng-cloak`现在正在运作. (3认同)
  • 我同意 - 关于最终加载脚本的事情来自正常的Web开发,你希望页面在js执行之前显示某些东西,但在有角度的情况下,你实际上想要反过来. (2认同)

Mat*_*hes 27

我使用ngCloak从来没有太多运气.尽管如上所述,我仍然会闪烁.避免轻弹的唯一可靠方法是将您的内容放在模板中并包含模板.在SPA中,唯一将在Angular编译之前评估的HTML是您的主要index.html页面.

只需取出身体内的所有物品并将其粘贴在单独的文件中,然后:

<ng-include src="'views/indexMain.html'"></ng-include>
Run Code Online (Sandbox Code Playgroud)

你永远不应该得到任何闪烁,因为Angular会在将模板添加到DOM之前编译模板.

  • 请注意,`ng-include`会产生额外的AJAX请求以从服务器获取内容.我学到了很难,例如,你应该永远不要在`ng-repeat`中使用`ng-include`. (2认同)
  • 此解决方案效果最佳,没​​有任何打嗝.如果可行,请使用此解决方案. (2认同)
  • 这个解决方案修复了一个非常烦人的情况 谢谢! (2认同)

Mar*_*cok 22

ngBindngBindTemplate是不需要CSS的替代品:

<div ng-show="foo != null" ng-cloak>{{name}}</div>  <!-- requires CSS -->
<div ng-show="foo != null" ng-bind="name"></div>
<div ng-show="foo != null" ng-bind-template="name = {{name}}"></div>
Run Code Online (Sandbox Code Playgroud)


Cor*_*lou 20

除了你接受的答案,如果你正在使用另一种触发ng-cloak的方法......

您可能还希望为CSS/LESS添加一些额外的特性:

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


Seb*_*als 15

我有一个类似的问题,发现如果你有一个包含转换的类,元素将闪烁.我尝试添加ng-cloak但没有成功,但是通过删除转换按钮停止闪烁.

我正在使用离子框架,按钮轮廓有这种转变

.button-outline {
  -webkit-transition: opacity .1s;
  transition: opacity .1s;
}
Run Code Online (Sandbox Code Playgroud)

只需覆盖该类即可删除转换,按钮将停止闪烁.

更新

再次使用离子时,使用ng-show/ng-hide时会出现闪烁现象.添加以下CSS可以解决它:

.ng-hide-add,
.ng-hide-remove {
  display: none !important;
}
Run Code Online (Sandbox Code Playgroud)

资料来源:http://forum.ionicframework.com/t/beta-14-ng-hide-show/14270/9


met*_*att 9

我有一个问题<div ng-show="expression">,即在"ng-show"指令有机会运行之前,即使"表达式"最初为假,也会在几分之一秒内初现可见.

我使用的解决方案是手动添加"ng-hide"类<div ng-show="expression" ng-hide>,以确保它最初隐藏起来.ng-show指令将在必要时添加/删除ng-hide类.


Cop*_*ick 7

尝试关闭Firebug.我是认真的.这有助于我的情况.

应用已接受的答案,然后确保Firefox 中的Firebug关闭:按F12,然后关闭此页面的Firebug - 右上角的小按钮.


And*_*nes 6

实际上有两个可能导致闪烁问题的独立问题,您可能面临其中一个或两个.

问题1:ng-cloak应用太晚了

这个问题已经解决,因为这个页面上的许多答案都是为了确保AngularJS被加载到头部.请参阅ngCloak doc:

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

问题2:过早删除ng-cloak

如果您的页面上有很多CSS,并且规则层叠在一起,并且在应用顶层之前CSS的较深层会闪烁,则最有可能发生此问题.

style="display:none"只要样式被删除得足够晚(实际上这些解决方案解决了这两个问题),jQuery解决方案的答案涉及添加到您的元素确实解决了这个问题.但是,如果您不想直接向HTML添加样式,则可以使用相同的结果ng-show.

从问题中的示例开始:

<ul ng-show="foo != null" ng-cloak>..</ul>
Run Code Online (Sandbox Code Playgroud)

在元素中添加额外的ng-show规则:

<ul ng-show="isPageFullyLoaded && (foo != null)" ng-cloak>..</ul>
Run Code Online (Sandbox Code Playgroud)

(你需要保持ng-cloak避免问题1).

然后在你的app.run中设置isPageFullyLoaded:

app.run(['$rootScope', function ($rootScope) {
    $rootScope.$safeApply = function (fn) {
        $rootScope.isPageFullyLoaded = true;
    }
}]);
Run Code Online (Sandbox Code Playgroud)

请注意,根据您正在做的事情,app.run可能是也可能不是最好的设置位置isPageFullyLoaded.重要的是要确保isPageFullyLoaded在你不想闪烁之后将其设置为true,以便向用户显示.

听起来像问题1是OP正在遇到的问题,但是其他人发现解决方案不起作用或者只是部分起作用,因为他们正在反击问题2或者也是如此.

重要说明:请确保对应用太晚的ng-cloak和即将移除的ng-cloak应用解决方案.仅解决这些问题中的一个可能无法缓解症状.