ChatGPT解决这个技术问题 Extra ChatGPT

防止双花括号符号在 angular.js 编译/插入文档之前暂时显示

当有许多图像/脚本要加载时,这似乎主要是 IE 中的一个问题,可能会在很长一段时间内显示标记中的文字 {{stringExpression}},然后在 Angular 完成编译后消失/interpolation 文件。

是否有一个常见的原因会发生这种情况,这表明我做错了什么,或者是否有已知的方法可以防止这种情况发生?

以上是正确的解决方案

C
Community

我认为您正在寻找 ngCloak 指令:https://docs.angularjs.org/api/ng/directive/ngCloak

从文档中:

ngCloak 指令用于防止 Angular html 模板在加载应用程序时被浏览器以原始(未编译)形式短暂显示。使用该指令可以避免 html 模板显示引起的不良闪烁效果。该指令可以应用于 元素,但首选用法是将多个 ngCloak 指令应用于页面的一小部分,以允许渐进式呈现浏览器视图


为避免使用原始 Angular HTML 代码,ngCloak 是否普遍/最佳做法?这似乎很简单,但我在 AngularJS 方面没有经验。
如果您在正文末尾加载所有脚本,我认为这不会起作用。
啊,等等,nvm,如果您最后加载脚本,LOAS 的答案就是解决方案。使用 .ng-cloak 类。
在您的 html 的 <head> 部分加载 angularjs 脚本,以使 ngCloak 生效。
如果我在页面的 <head> 部分加载 angular.js,我可以确认它运行良好。
A
Andrew Joslin

此外,您可以使用 <span ng-bind="hello"></span> 代替 {{hello}}

http://jsfiddle.net/4LhN9/34/


关于 ng-bind 的一个有时被忽略的特性是,您可以指定在 Angular 加载时显示的文本:正在加载...。 “正在加载...”将出现,然后在定义 myScopeProperty 后被替换。
@MarkRajcok:感谢您的提示!我不知道。这非常简单优雅,解决了我自己遇到的一个问题。
如果您需要多个表达式,请使用 ngBindTemplate。例如,正在加载...
你也可以做{{你好|| '正在加载...'}}
@AndyJoslin 不错。使用这种方法,Angular js 脚本需要位于头部,而不是页面底部,以避免在页面加载时 {{}} 表达式闪烁。
L
LOAS

为了提高最后加载脚本时 class='ng-cloak' 方法的有效性,请确保在文档头部加载以下 css:

.ng-cloak { display:none; }

添加 !important 也不错。
visibility: hidden 不是更好吗?
@eomeroff,但是 !important 是一个 CSS hack(坏事)来推广要选择的样式,对吧?它打破了 CSS 选择器规则。
恕我直言,这是 !important 的案例之一。
@Mark我猜“可见性:隐藏”仍然会呈现模板标记所需的空间,而“显示:无”根本不会呈现任何东西。仅隐藏可见性,任何外部元素都可能突然塌陷到真正的内部大小,而不是从无到有增长到大小。我想这是任何人喜欢的。 :)
B
Bennett McElwee

只需将隐藏的 CSS 添加到页面头部或您的 CSS 文件之一:

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

然后您可以按照正常的 Angular 实践使用 ngCloak directive,它甚至可以在 Angular 本身加载之前工作。

这正是 Angular 所做的:angular.js 末尾的代码将上述 CSS 规则添加到页面头部。


+1 我自己提出了 [ngcloak] 选择器,但这更完整。
真棒答案!我在正文的末尾加载了 Angular,因此 ngCloak 不可用,它仍然会闪烁 {{}}。这解决了它。
N
Nathan Senevirathne

在您的 CSS 中添加以下内容

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

然后在你的代码中你可以添加 ng-cloak 指令。例如,

<div ng-cloak>
   Welcome {{data.name}}
</div>

而已!


M
Martin Schüller

您也可以使用 ng-attr-src="{{variable}}" 而不是 src="{{variable}}",并且该属性只会在编译器编译模板后生成。这在文档中提到:https://docs.angularjs.org/guide/directive#-ngattr-attribute-bindings


J
Jaison James

我同意@pkozlowski.opensource 的回答,但 ng-clock 类不适用于我与 ng-repeat 一起使用。所以我想推荐你使用简单的分隔符表达式类,比如 {{name}} 和 ng-repeat 的 ngCloak 指令。

<div class="ng-cloak">{{name}}<div>

<li ng-repeat="item in items" ng-cloak>{{item.name}}<li>

谢谢你注意到我的错误

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅