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

IT技术 javascript class angularjs
2021-01-30 08:06:41

我在 angular.js 中遇到指令/类ng-cloakng-show.

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

例子:

<ul ng-show="foo != null" ng-cloak>..</ul>
6个回答

虽然文档没有提到它,但将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;
}

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

<ul class="nav">
  <li><a href="/foo" ng-cloak>{{bar}}</a></li>
</ul>

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

.nav > li > a {
  display: block;
}

因此,如果您使用display: none;simple包含规则,Bootstrap 的规则将优先并且display将设置为block,因此您将在模板编译之前看到闪烁。

如果上述 css 对您不起作用,则您的:inng:cloak可能没有正确转义。对于纯 CSS,请确保存在反斜杠。对于已编译的 css,例如 Stylus,它将是[ng\\:cloak]. 检查你编译的 CSS 以确保它是正确的。
2021-03-15 08:06:41
浏览器不应该在不考虑 css 的情况下渲染 DOM,即使是在第一次通过时;那将是非常低效的;仔细检查您的设置:p
2021-03-17 08:06:41
一旦您延迟加载该 doms module代码,您如何重新引导已被 ng-cloaked 的 dom?
2021-03-18 08:06:41
另请注意,如果您使用异步加载器(例如 require.js)加载 angular.js,也会发生同样的问题,因为 .js 中的 css 规则不会被及时解析。上面的解决方案也修复了这种情况。
2021-03-19 08:06:41
不解决我的问题。不知道 - 我认为浏览器最初太渴望显示内容......
2021-03-22 08:06:41

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

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

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

希望有帮助!

换句话说,如果您在页面底部添加脚本引用(很多人都是这样做的);然后将规则添加到您的 CSS。
2021-03-21 08:06:41
什么是真正的文件中提到的是这样的:“为了达到最佳效果,angular.js脚本必须在HTML文件的头部被加载;或者,在CSS规则(上)必须包含在应用程序的外部样式表。 ”
2021-03-25 08:06:41
向包含 ng-app 指令的 html 元素添加了 ng-cloak 指令。像魅力一样工作。示例:<div ng-cloak ng-app="my-app">
2021-03-26 08:06:41
angular.js 将该样式规则添加到文档的头部。你真的不需要把它添加到你的 CSS 中。也就是说,这似乎有效。我的猜测是因为 angular.js 直到加载 angular 之后才会将样式块添加到头部。
2021-03-28 08:06:41
我在 require.js 中添加了 angular.js,所以这对我有帮助。
2021-03-29 08:06:41

确保 AngularJS 包含在headHTML 中。参见ngCloak 文档

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

是的!我不明白为什么各地的人似乎都建议在页面末尾加载 angular.js。如果 Angular 从一开始就控制,我会感觉更好。ng-cloak的现在在工作。
2021-03-28 08:06:41
AND 在加载任何样式表之前。head在样式表中包含 Angular但在样式表包含之后,并不能解决问题。
2021-03-29 08:06:41
我同意 - 最后加载脚本的事情来自正常的 Web 开发,您希望页面在 js 执行其操作之前显示某些内容,但在 angular 的情况下,您实际上想要相反的内容。
2021-03-31 08:06:41

我使用 ngCloak 从来没有这么幸运过。尽管有上面提到的一切,我仍然会闪烁。避免轻弹的唯一可靠方法是将您的内容放在模板中并包含该模板。在 SPA 中,在被 Angular 编译之前唯一需要评估的 HTML 是您的主要 index.html 页面。

只需将身体内部的所有东西都放在一个单独的文件中,然后:

<ng-include src="'views/indexMain.html'"></ng-include>

您永远不应该以这种方式闪烁,因为 Angular 会在将模板添加到 DOM 之前对其进行编译。

正是我使用的 - 干净简单,没有痛苦的黑客。
2021-03-19 08:06:41
为我工作。记得在你的标记中保持ng-app在 the 之外ng-include
2021-03-20 08:06:41
这个解决方案解决了一个非常烦人的情况。谢谢!
2021-03-27 08:06:41
这个解决方案效果最好,没有任何问题。如果可行,请使用此解决方案。
2021-03-29 08:06:41
请注意,它会ng-include产生一个额外的 AJAX 请求来从服务器获取内容。例如,我学到了你永远不应该使用ng-includeinside的艰难方法ng-repeat
2021-04-04 08:06:41

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>
ng-bind 是解决问题的更好方法,因为其他答案要求您加载第一个角度,在任何情况下都没有大括号闪烁
2021-03-14 08:06:41
很好,简单的答案。ng-bind是避免“花括号 flash”或不得不ng-cloak在标记级别使用的好方法,尽管有些人认为它会使代码可读性降低。对他们来说,我认为没有理由不混合这两种方法。
2021-04-06 08:06:41