angularjs之ng-if、ng-show、ng-switch那些事
一、蓝瘦~香菇
经常在项目中使用ng-if和ng-show来处理一些简单的状态,今天碰到一个复杂的状态判断,不经让我想起ng-switch。第一次接触他的时候,我没怎么注意他,因为我直接把他当作其他语言中的switch了,甚至不知道他和ng-if、ng-show的作用相同,是用来控制元素的显示和隐藏的。
其实有语言基础的,用脚指头都能想到,switch语句在语言中为何会出现?其正是为了弥补选择结构上代码的冗余,所以他又叫做多分支选择语句,而if~else或者if~else if~else if~else这类的选择结构语句在多种条件判断下就显得又臭又长了,我觉着就从这点来看既然我知道ng-if是干吗的,我就应该分分钟认识到ng-switch是干吗的,结果我一直给自己挖了个坑。。蓝瘦~香菇~(┬_┬),看完本文你会晓得:
display:none内部原来是宽高的问题,visibility:hidden依旧
为什么有了ng-if还要有ng-switch和ng-show
二、区别与应用
上边谈到ng-if、ng-switch、ng-show都能用来控制元素的隐藏和显示,其内部区别肯定还是有不同的,具体来看:
ng-if:接收boolean类型的值,若为false则元素dom节点会不存在改为一个注释语句
ng-switch:与我们常见的switch语句语法相似,配合ng-switch-when和ng-switch-default使用,上文也说过,既然switch当时出现的原因是为了弥补if的缺憾,那他和ng-if所展示的效果自然也相同咯-----若为false则元素dom节点会不存在改为一个注释语句
ng-show:接收boolean类型的值,若为false则相当于为该元素增加了一个display:none的属性,学过css的都知道,display这里有个知识点是他和visibility的区别。嗯,有人回答了,前者让其在网页中不占空间了,后者其还在原来的位置上,只是变为不可见。
ng-switch用法
<div ng-controller="test">
<ul ng-switch="case">
<li ng-switch-when="a1">a1</li>
<li ng-switch-when="a2">a2</li> //选中
<li ng-switch-when="a3">a3</li>
<li ng-switch-when="a4">a4</li>
<li ng-switch-when="a5">a5</li>
<li ng-switch-default="a6">a6</li>
</ul>
</div>
$scope.case = "a2";
ng-if和ng-show的用法
<li ng-show="false">1</li>
<li ng-if="false">1</li>


三、讨伐
读完上部分,不管你信不信,我貌似是终于总结出来为什么有了ng-if还要ng-show和ng-switch了,其内部做的事情决定了渲染时的性能(有些在页面初始化时就有dom元素了,有些需要的时候再产生dom元素即可),也决定了他的应用场景(如ng-switch可以做多tab的切换)。
不过上文还有个问题点,误导我一时,相信挺多像我一样的小菜现在也依旧被蒙在谷里,那就是display:none是不占位置,其实我还真不理解啥子叫不占位置,哥们,你说的真笼统,本着严谨的心态,我还是查了下,前方高能———其实“display:none”真正的作用是置元素的宽高为失效状态,那啥子叫失效状态呢?其实就是height和width都为不可设自动变为auto值。这也就可以理解这两者的其他区别如涉及到回流和重绘方面的问题和为什么display后其子孙也会被隐藏,而visibity的子子孙孙还有办法被显示。

所以我想,display:none和visibility的区别要重新掰正一下了,其真正的原理是前者置宽高为不可设状态且子孙会沿袭,后者置可见度为hidden且子孙也会沿袭。
angularjs之ng-if、ng-show、ng-switch那些事的更多相关文章
- 不知道张(zhāng)雱(pāng)是谁?你out了!
张(zhāng)雱(pāng)是谁?也许你已经听说过了,也许你还没听说过呢,不过你一定听说过老刘——刘强东,没错,这二人是有关系的,什么关系,京东是老刘的,而张雱呢?张雱是京东旗下52家关联公司法人代 ...
- ng build --aot 与 ng build --prod
angluar的编译有以下几种方式: ng build 常规的压缩操作 代码体积最大 ng build --aot angular预编译 代码体积较小 ng build --pr ...
- Ngnice-国内ng学习网站
今天给angular新手介绍一个国内开源的ng学习网站http://www.ngnice.com/这是由一批ng爱好者在雪狼大叔的带领下共同开发完成,致力于帮助更多的ng新人,他们分别是: ckken ...
- 国内ng学习网站
Ngnice-国内ng学习网站2015-01-25 21:30 by 破狼, 534 阅读, 3 评论,收藏, 编辑 今天给angular新手介绍一个国内开源的ng学习网站http://www.ngn ...
- [译]ng指令中的compile与link函数解析 转
通常大家在使用ng中的指令的时候,用的链接函数最多的是link属性,下面这篇文章将告诉大家complie,pre-link,post-link的用法与区别. 原文地址 angularjs里的指令非常神 ...
- 【码在江湖】前端少侠的json故事(中)ng的json
ng的json 正所谓"人在江湖,身不由己",在开发之路上前端少侠dk遇到过种种困难,尤其在与后端进行数据对接的时候,不得不逼迫自己以极快的速度去学习和掌握一些奇招怪式,正当他以为 ...
- 高可用Hadoop平台-Flume NG实战图解篇
1.概述 今天补充一篇关于Flume的博客,前面在讲解高可用的Hadoop平台的时候遗漏了这篇,本篇博客为大家讲述以下内容: Flume NG简述 单点Flume NG搭建.运行 高可用Flume N ...
- ng环境搭建步骤
1,安装node node -v查看版本号 2,安装淘宝镜像 npm config set registry https://registry.npm.taobao.org 3,安装cnpm npm ...
- Ng Alain使用 - cli和克隆两种方式
感觉没啥要写的,但是在查看相关资料的过程中发现不少浮夸的人,可以说是完全不阅读官方文档,操作完全无厘头,,创建了删,配置,再删除,,,扯蛋....., 方式一:CLI(推荐) # 确保使用的是最新版本 ...
- angular 2 - 001 ng cli的安装和使用
angular cli 创建项目和组件 ng new my-app --skip-install cd my-app cnpm install ng serve localhost:4200 angu ...
随机推荐
- VS2015链接错误一则
以前天真的以为C是C++的子集,.c文件直接.cpp命名没什么影响: 后缀一改 链接器工具错误 LNK2019
- BZOJ4570: [Scoi2016]妖怪
题目传送门 4570: [Scoi2016]妖怪 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 491 Solved: 125 [Submit][Sta ...
- Jquery ajax运用执行顺序有误怎么解决
在这儿,可能就要提示一个ajax的一个属性async async默认的设置值为true,这种情况为异步方式,就是说当ajax发送请求后,在等待server端返回的这个过程中,前台会继续执行ajax块后 ...
- js 用途
嵌入动态文本于HTML页面.[4] 对浏览器事件做出响应.[4] 读写HTML元素.[4] 在数据被提交到服务器之前验证数据.[4] 检测访客的浏览器信息.[4] 控制cookies,包括创 ...
- WebUploader UEditor chrome 点击上传文件选择框会延迟几秒才会显示 反应很慢
chrome52.0.2743.80以上, accept: { title: 'Images', extensions: 'jpg,jpeg,png', mimeTypes: 'image/*' } ...
- welcome to learn prgram
Tips for your suceess(成功的秘诀) 1. Practice every day(每天练习) 每天用两小时来学习.你可以使用各种零碎时间,积少成多.你可以使用搞这些时间用来巩固练习 ...
- Angular.js内置的63个指令
- Windows综合应用
待修改中-------------------------------------- 快捷键部分: Win+E:打开"我的电脑"E:Explot的缩写,即资源管理器. ------ ...
- 百度编辑器 ueditor 内容编辑自动套P标签,及p标签 替换
如图,红框为回车键和shift+回车 : ===>> ueditor.all.js中: 1: 搜索修改成false:allowDivTransToP: false 再搜索并修改以下 ...
- 完整的PHP MYSQL数据库类
<?php class mysql { private $db_host; //数据库主机 private $db_user; //数据库用户名 private $db_ ...