实际上有两个不同的问题会导致闪烁问题,您可能会遇到其中一个或两个问题。
问题1:ng-cloak应用太晚
此问题已解决,因为此页面上的许多答案中都描述了确保 AngularJS 已加载到头部。见ngCloak doc:
为了获得最佳效果,必须在头部加载 angular.js 脚本
html文件的部分;或者,CSS规则(上面)必须是
包含在应用程序的外部样式表中。
问题 2:ng-cloak 移除太快
当您的页面上有大量 CSS 且规则相互层叠且较深的 CSS 层在应用顶层之前闪现时,最有可能发生此问题。
涉及将style="display:none" 添加到您的元素的答案中的 jQuery 解决方案确实可以解决此问题,只要足够晚地删除样式即可(实际上这些解决方案可以解决这两个问题)。但是,如果您不想直接将样式添加到 HTML 中,您可以使用 ng-show 获得相同的结果。
从问题的例子开始:
<ul ng-show="foo != null" ng-cloak>..</ul>
向您的元素添加额外的 ng-show 规则:
<ul ng-show="isPageFullyLoaded && (foo != null)" ng-cloak>..</ul>
(您需要保留ng-cloak以避免出现问题1)。
然后在你的 app.run 中设置isPageFullyLoaded:
app.run(['$rootScope', function ($rootScope) {
$rootScope.$safeApply = function (fn) {
$rootScope.isPageFullyLoaded = true;
}
}]);
请注意,根据您的具体操作,app.run 可能是也可能不是设置isPageFullyLoaded 的最佳位置。重要的是确保 isPageFullyLoaded 在您不想闪烁的任何内容准备好向用户显示之后设置为 true。
听起来 Problem 1 是 OP 遇到的问题,但其他人发现解决方案不起作用或仅部分起作用,因为他们正在解决 Problem 2或者也一样。
重要提示:确保将解决方案应用于 ng-cloak 应用得太晚和很快被移除的情况。仅解决其中一个问题可能无法缓解症状。