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 相关文章推荐
通过javascript获取iframe里的值示例代码
Jun 24 Javascript
JavaScript前端图片加载管理器imagepool使用详解
Dec 29 Javascript
谈谈impress.js初步理解
Sep 09 Javascript
Jquery 垂直多级手风琴菜单附源码下载
Nov 17 Javascript
浅谈js中的延迟执行和定时执行
May 31 Javascript
jquery ezUI 双击行记录弹窗查看明细的实现方法
Jun 01 Javascript
Javascript 普通函数和构造函数的区别
Nov 05 Javascript
JavaScript字符串转数字的5种方法及遇到的坑
Jul 16 Javascript
Angularjs Ng_repeat中实现复选框选中并显示不同的样式方法
Sep 12 Javascript
js之切换全屏和退出全屏实现代码实例
Sep 09 Javascript
解决在layer.open中使用时间控件laydate失败的问题
Sep 11 Javascript
解决vue props传Array/Object类型值,子组件报错的情况
Nov 07 Javascript
轻松理解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
php session处理的定制
2009/03/16 PHP
PHP性能优化准备篇图解PEAR安装
2011/12/05 PHP
使用php语句将数据库*.sql文件导入数据库
2014/05/05 PHP
JavaScript脚本语言在网页中的简单应用
2007/05/13 Javascript
ajax与302响应代码测试
2013/10/23 Javascript
JS实现控制表格行文本对齐的方法
2015/03/30 Javascript
javascript生成大小写字母
2015/07/03 Javascript
javascript日期验证之输入日期大于等于当前日期
2015/12/13 Javascript
javascript原生ajax写法分享
2016/04/10 Javascript
JS 实现可停顿的垂直滚动实例代码
2016/11/23 Javascript
jquery+ajax实现省市区三级联动效果简单示例
2017/01/04 Javascript
微信小程序 Tab页切换更新数据
2017/01/05 Javascript
Bootstrap.css与layDate日期选择样式起冲突的解决办法
2017/04/07 Javascript
简单实现jQuery弹幕效果
2017/05/06 jQuery
Node.js 8 中的 util.promisify的详解
2017/06/12 Javascript
vuejs 制作背景淡入淡出切换动画的实例
2018/09/01 Javascript
jQuery实现的卷帘门滑入滑出效果【案例】
2019/02/18 jQuery
vue动态注册组件实例代码详解
2019/05/30 Javascript
JS使用new操作符创建对象的方法分析
2019/05/30 Javascript
layui弹出框Tab选项卡的示例代码
2019/09/04 Javascript
ES6扩展运算符和rest运算符用法实例分析
2020/05/23 Javascript
[49:35]2018DOTA2亚洲邀请赛3月30日 小组赛A组 KG VS TNC
2018/03/31 DOTA
Python的Flask框架中实现登录用户的个人资料和头像的教程
2015/04/20 Python
Python CategoricalDtype自定义排序实现原理解析
2020/09/11 Python
Numpy ndarray 多维数组对象的使用
2021/02/10 Python
css3选择器基本介绍
2014/12/15 HTML / CSS
使用Html5实现异步上传文件,支持跨域,带有上传进度条
2016/09/17 HTML / CSS
HTML5 图片悬停放大的实现代码示例
2019/12/04 HTML / CSS
研修第一天随笔感言
2014/02/15 职场文书
《邮票齿孔的故事》教学反思
2014/02/22 职场文书
基层干部2014全国两会学习心得体会
2014/03/10 职场文书
导师就业推荐信范文
2014/05/22 职场文书
党校毕业心得体会
2014/09/13 职场文书
2014年学校办公室工作总结
2014/12/19 职场文书
办公室文员岗位职责
2015/02/04 职场文书
2016年基层党组织公开承诺书
2016/03/25 职场文书