ngCloak 实现 angular 初始化闪烁最佳实践

本文涉及的产品
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
简介:

在做angular的SPA开发时,我们经常会遇见在如Chrome这类能够快速解析的浏览器上出现表达式({% raw %}` express `} {% endraw %}),或者是模块(div)的闪烁。对于这个问题由于JavaScript去操作DOM,都会等待DOM加载完成(DOM ready)。对于angular会在DOM ready完会才回去解析html view Template,所以对于Chrome这类快速的浏览器你会看见有闪烁的情况出现。而对于IE7,8这类解析稍慢的浏览器大部分情况下是不会出现这个问题的。

在angular中为我们提供了ng-cloak来实现纺织闪烁的方案,我们只需要在需要的地方加上ng-cloak。同时对于bing文字({% raw %}` express `} {% endraw %})我们也可以改为ng-bind来实现避免。

1
2
3
< div  id = "template1"  ng-cloak>{{ 'hello' }}</ div >
< div  id = "template2"  ng-cloak  class = "ng-cloak" >{{  'hello IE7' }}</ div >
< div  id = "template2"  ng-bing = "'hello IE7'" ></ div >

angular讲ng-cloak实现为一个directive,并会在初始化的时候在DOM的heade增加一行css代码,如下:

1
2
<style type= "text/css" >@charset  "UTF-8" ;[ng\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak,.ng- hide { display : none  !important ;}ng\:form{ display : block ;}.ng-animate-start{ clip :rect( 0 , auto , auto , 0 );-ms-zoom: 1.0001 ;}.ng-animate-active{ clip :rect( -1px , auto , auto , 0 );-ms-zoom: 1 ;}
</style>

从上面我们可以看见angular将带有ng-clock的的元素设置为display:none,隐藏掉,在等到angular解析到带有ng-clock的节点时候,会把attribute和class同时remove掉,这样就可以实现防止节点的闪烁。

1
2
3
4
5
6
var  ngCloakDirective = ngDirective({
       compile:  function (element, attr) {
         attr.$set( 'ngCloak' , undefined);
         element.removeClass( 'ng-cloak' );
       }
});

在angular-bootstrap.js中会看见这样的代码去增加前面所说的css:

1
document.write( '<link rel="stylesheet" type="text/css" href="'  + serverPath +  '../css/angular.css"/>' );

好像闪烁的问题好像已经能够被我解决了,恩是否是这样的,理论也改如此,但是现实是残酷的,我们的感性认识经常会被现实一记重重的耳光,我们才能很更深入全面的思考,如果浏览器的速度比angular在head中加入css的速度还快呢?我在给公司的一个项目组解决这个闪烁的问题的时候就遇见了这个问题。怎么办呢?那我们只能使出我们必杀技,自己把css加入我们的css文件引入heade,启动加载,ok这样就可以完美解决了。(如果你也遇见了加了ng-cloak还不起作用的话,那么试试直接引入css文件吧)

到这里关于ng-cloak的原理和解决方案已经完成,欢迎继续关注angular的后续经验篇分享。





 本文转自 破狼 51CTO博客,原文链接:http://blog.51cto.com/whitewolfblog/1346222,如需转载请自行联系原作者

相关文章
|
3月前
|
开发者 Java 存储
JSF 与 CDI 携手共进,紧跟技术热点,激发开发者情感共鸣,开启高效开发新征程
【8月更文挑战第31天】JavaServer Faces (JSF) 与 Contexts and Dependency Injection (CDI) 在 Java EE 领域中紧密协作,助力开发者高效构建现代 Web 应用。JSF 凭借其丰富的组件库和页面导航功能受到青睐,而 CDI 则优雅地管理对象生命周期并实现依赖注入。两者结合,不仅简化了复杂企业应用的开发,还实现了松耦合架构,增强了代码的灵活性、可维护性和可扩展性。通过示例展示了如何利用 CDI 将业务服务对象注入 JSF Managed Bean,以及如何在不同页面间共享数据,突显了这一组合的强大功能。
38 0
|
3月前
|
开发者 iOS开发 C#
Uno Platform 入门超详细指南:从零开始教你打造兼容 Web、Windows、iOS 和 Android 的跨平台应用,轻松掌握 XAML 与 C# 开发技巧,快速上手示例代码助你迈出第一步
【8月更文挑战第31天】Uno Platform 是一个基于 Microsoft .NET 的开源框架,支持使用 C# 和 XAML 构建跨平台应用,适用于 Web(WebAssembly)、Windows、Linux、macOS、iOS 和 Android。它允许开发者共享几乎全部的业务逻辑和 UI 代码,同时保持原生性能。选择 Uno Platform 可以统一开发体验,减少代码重复,降低开发成本。安装时需先配置好 Visual Studio 或 Visual Studio for Mac,并通过 NuGet 或官网下载工具包。
182 0
|
3月前
|
容器 iOS开发 Linux
震惊!Uno Platform 响应式 UI 构建秘籍大公开!从布局容器到自适应设计,带你轻松打造跨平台完美界面
【8月更文挑战第31天】Uno Platform 是一款强大的跨平台应用开发框架,支持 Web、桌面(Windows、macOS、Linux)及移动(iOS、Android)等平台,仅需单一代码库。本文分享了四个构建响应式用户界面的最佳实践:利用布局容器(如 Grid)适配不同屏幕尺寸;采用自适应布局调整 UI;使用媒体查询定制样式;遵循响应式设计原则确保 UI 元素自适应调整。通过这些方法,开发者可以为用户提供一致且优秀的多设备体验。
112 0
|
3月前
|
开发者 容器 Docker
JSF与Docker,引领容器化浪潮!让你的Web应用如虎添翼,轻松应对高并发!
【8月更文挑战第31天】在现代Web应用开发中,JSF框架因其实用性和灵活性被广泛应用。随着云计算及微服务架构的兴起,容器化技术变得日益重要,Docker作为该领域的佼佼者,为JSF应用提供了便捷的部署和管理方案。本文通过基础概念讲解及示例代码展示了如何利用Docker容器化JSF应用,帮助开发者实现高效、便携的应用部署。同时也提醒开发者注意JSF与Docker结合使用时可能遇到的限制,并根据实际情况做出合理选择。
40 0
|
Java
Angular最新教程-第四节详细说明初始化项目
Angular最新教程-第四节详细说明初始化项目
300 0
Angular最新教程-第四节详细说明初始化项目
Angular Component 实现类,先执行字段初始化,再调用构造函数
Angular Component 实现类,先执行字段初始化,再调用构造函数
125 0
Angular Component 实现类,先执行字段初始化,再调用构造函数
|
前端开发 JavaScript
Angular 应用 bootstrapModule 映射的 app Component 的初始化逻辑
Angular 应用 bootstrapModule 映射的 app Component 的初始化逻辑
147 0
Angular 应用 bootstrapModule 映射的 app Component 的初始化逻辑
Angular Component class属性初始化和构造函数执行的先后顺序
Angular Component class属性初始化和构造函数执行的先后顺序
289 0
Angular Component class属性初始化和构造函数执行的先后顺序
|
网络架构
Angular应用内路由(In App Route)的最佳实践
Angular应用内路由(In App Route)的最佳实践
117 0
Angular应用内路由(In App Route)的最佳实践