Angular.js中ng-if、ng-show和ng-hide的区别介绍


Posted in Javascript onJanuary 20, 2017

前言

大家都知道在使用anularjs开发前端页面时,常常使用ng-show、ng-hide、ng-if功能来控制页面元素的显示或隐藏,那他们之间有什么不同呢?下面通过这篇文章来一起看看吧。

实现原理

ng-show/ng-hide是通过修改CSS样式方式控制元素显示与隐藏,对应的DOM元素会一直存在于当前页面中,而ng-if根据表达式的值动态的在当前的页面中添加删除页面元素。如果赋值表达式的值为false,那么这个元素就会从页面中删除,否则会添加一个元素。ng-if创建元素时用的是被它编译后的代码,如果ng-if内部的代码被其它方式修改过,那么修改只会对本次展现有效,页面元素重新渲染后修改效果会消失,而ng-show/ng-hide则能够保留dom元素上次修改后的状态。

在作用域方面,两者也存在差异:当一个元素被ng-if从DOM中删除时,与其关联的作用域也会被销毁。而且当它重新加入DOM中时,则会生成一个新的作用域,而ng-show和ng-hide则不会。

通过如下代码并结合浏览器开发者工具可以清楚的看出二者之间的不同:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" ng-app="app">
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>ng-if ng-show ng-hide</title>
 <script type="text/javascript" class="library" src="http://libs.useso.com/js/angular.js/1.2.9/angular.min.js"></script>
 </head>
<body>
 <div ng-controller="MainCtrl">
  <div ng-show="false">
   ng-show = false 
  </div>
  <div ng-show="true">
  ng-show=true 
  </div>
  <div ng-if="true">
  ng-if = true
  </div>
  <div ng-if="false">
  ng-if = false
  </div>
 </div>
 </body>
</html>

js

angular.module("app",[]).controller("MainCtrl",function($scope){
});

页面最终的HTML片断如下:

<div ng-controller="MainCtrl" class="ng-scope">
 <div ng-show="false" class="ng-hide">
 ng-show = false 
 </div>
 <div ng-show="true" class="">
 ng-show=true 
 </div>
 <!-- ngIf: true --><div ng-if="true" class="ng-scope">
 ng-if = true
 </div><!-- end ngIf: true -->
 <!-- ngIf: false -->
</div>

由于ng-if/ng-hide(ng-show)在原理上有很大的差别,所以在某些情况下展示出来的效果有较大的差别。

正确使用ng-if和ng-show

在使用bootstrap中,我们会经常用到按钮组,也就是btn-group,如果仔细观察的话,会发现一个按钮组的第一个和最后一个按钮分别是有圆角的,如下图:

Angular.js中ng-if、ng-show和ng-hide的区别介绍

但是中间的按钮是没有圆角的,这样显得比较美观。

在结合angular使用过程中,有时候需要根据一些条件来隐藏掉一些按钮,当隐藏第一个或最后一个按钮时,会出现一些小问题。

代码:

<div class="row" ng-controller='myCtrl'>
  <div class="col-lg-offset-1">
  <div class="btn-group">
   <button class='btn btn-primary'>button1</button>
   <button class='btn btn-primary'>button2</button>
   <button class='btn btn-primary' ng-show='false'>button3</button>
  </div>
  </div>
 </div>

效果如图:

Angular.js中ng-if、ng-show和ng-hide的区别介绍

我们发现button2的圆角不见了,这和我们预期的效果不一致。

问题是由ng-show引起的,而我们知道ng-show只是改变元素的display属性,所以我们把这个ng-show='false'改成 style='display:none' 的话也会有这个圆角消失的效果。

那么我们应该怎么做,才会让它显示圆角呢?

如果我们想要达到显示圆角的效果,那么我们应该用ng-if ,只需要将代码中的ng-show='false' 改成ng-if='false' 即可。

原因是:ng-if会根据表达式的值来决定当前这个DOM元素的创建与销毁。当表达式为返回true时,创建,反之,则销毁。销毁就意味着这个DOM元素从页面中删除了。

效果如图:

Angular.js中ng-if、ng-show和ng-hide的区别介绍

圆角显示了,证明button3已经从页面中删除了。

再进一步,我们打开开发者工具也可以发现这个DOM元素确实已经不存在了:

Angular.js中ng-if、ng-show和ng-hide的区别介绍

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

Javascript 相关文章推荐
js 获取浏览器高度和宽度值(多浏览器)
Sep 02 Javascript
点击下载链接 弹出页面实现代码
Oct 01 Javascript
JS 如何获取radio选中后的值及不选择取radio的值
Oct 28 Javascript
JavaScript设计模式之建造者模式介绍
Dec 28 Javascript
js实现点击图片将图片地址复制到粘贴板的方法
Feb 16 Javascript
js一维数组、多维数组和对象的混合使用方法
Apr 03 Javascript
百度搜索框智能提示案例jsonp
Nov 28 Javascript
vue实现消息的无缝滚动效果的示例代码
Dec 05 Javascript
Vue中android4.4不兼容问题的解决方法
Sep 04 Javascript
浅析vue cli3 封装Svgicon组件正确姿势(推荐)
Apr 27 Javascript
JS this关键字在ajax中使用出现问题解决方案
Jul 17 Javascript
Vue实现手机号、验证码登录(60s禁用倒计时)
Dec 19 Vue.js
轻松理解Javascript变量的相关问题
Jan 20 #Javascript
js+css3实现旋转效果
Jan 20 #Javascript
Bootstrap 手风琴菜单的实现代码
Jan 20 #Javascript
浅谈angularjs $http提交数据探索
Jan 20 #Javascript
原生js实现无限循环轮播图效果
Jan 20 #Javascript
原生js实现弹出层效果
Jan 20 #Javascript
jQuery中DOM节点删除之empty与remove
Jan 20 #Javascript
You might like
第1次亲密接触PHP5(2)
2006/10/09 PHP
PHP取得一个类的属性和方法的实现代码
2011/05/22 PHP
LotusPhp笔记之:Cookie组件的使用详解
2013/05/06 PHP
基于PHPExcel的常用方法总结
2013/06/13 PHP
PHP关于IE下的iframe跨域导致session丢失问题解决方法
2013/10/10 PHP
学习php设计模式 php实现命令模式(command)
2015/12/08 PHP
Laravel中encrypt和decrypt的实现方法
2017/09/24 PHP
thinkphp框架类库扩展操作示例
2019/11/26 PHP
JavaScript语言中的Literal Syntax特性分析
2007/03/08 Javascript
JavaScript 利用StringBuffer类提升+=拼接字符串效率
2009/11/24 Javascript
浅析jQuery中常用的元素查找方法总结
2013/07/04 Javascript
javascript的tab切换原理与效果实现方法
2015/01/10 Javascript
JavaScript DOM元素尺寸和位置
2015/04/13 Javascript
drag-and-drop实现图片浏览器预览
2015/08/06 Javascript
jQuery遍历DOM的父级元素、子级元素和同级元素的方法总结
2016/07/07 Javascript
微信小程序图片宽100%显示并且不变形
2017/06/21 Javascript
详解Web使用webpack构建前端项目
2017/09/23 Javascript
js 显示日期时间的实例(时间过一秒加1)
2017/10/25 Javascript
微信小程序框架wepy之动态控制类名
2018/09/14 Javascript
vue-router权限控制(简单方式)
2018/10/29 Javascript
详解Vue Cli浏览器兼容性实践
2020/06/08 Javascript
vue3自定义dialog、modal组件的方法
2021/01/04 Vue.js
[01:30]DOTA2上海特锦赛现场采访 Loda倾情献唱
2016/03/25 DOTA
详细解读tornado协程(coroutine)原理
2018/01/15 Python
Django添加feeds功能的示例
2018/08/07 Python
python使用scrapy发送post请求的坑
2018/09/04 Python
如何通过50行Python代码获取公众号全部文章
2019/07/12 Python
python同步两个文件夹下的内容
2019/08/29 Python
30秒学会30个超实用Python代码片段【收藏版】
2019/10/15 Python
jupyter 实现notebook中显示完整的行和列
2020/04/09 Python
美国在线面料商店:Fashion Fabrics Club
2020/01/31 全球购物
what is the difference between ext2 and ext3
2013/11/03 面试题
中层竞聘演讲稿
2014/01/09 职场文书
入党自荐书范文
2015/03/05 职场文书
OpenCV实现常见的四种图像几何变换
2022/04/01 Python
我的收音机情缘
2022/04/05 无线电