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代码
Mar 11 Javascript
jQuery使用$.each遍历json数组的简单实现方法
Apr 18 Javascript
KnockoutJs快速入门教程
May 16 Javascript
Node.js+Express配置入门教程
May 19 Javascript
原生JavaScript实现的简单省市县三级联动功能示例
May 27 Javascript
基于AngularJS的拖拽文件上传的实例代码
Jul 15 Javascript
从vue基础开始创建一个简单的增删改查的实例代码(推荐)
Feb 11 Javascript
动态内存分配导致影响Javascript性能的问题
Dec 18 Javascript
vue使用Proxy实现双向绑定的方法示例
Mar 20 Javascript
JavaScript 严格模式(use strict)用法实例分析
Mar 04 Javascript
详解react组件通讯方式(多种)
May 06 Javascript
vue data对象重新赋值无效(未更改)的解决方式
Jul 24 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编程最快明白》第二讲 数字、浮点、布尔型、字符串和数组
2010/11/01 PHP
thinkPHP下的widget扩展用法实例分析
2015/12/26 PHP
ThinkPHP 3.2.3实现页面静态化功能的方法详解
2017/08/03 PHP
php微信开发之音乐回复功能
2018/06/14 PHP
PHP PDOStatement::columnCount讲解
2019/01/30 PHP
JS 控制非法字符的输入代码
2009/12/04 Javascript
使用js对select动态添加和删除OPTION示例代码
2013/08/12 Javascript
详解AngularJS中的作用域
2015/06/17 Javascript
举例详解JavaScript中Promise的使用
2015/06/24 Javascript
JS上传组件FileUpload自定义模板的使用方法
2016/05/10 Javascript
解决wx.onMenuShareTimeline出现的问题
2016/08/16 Javascript
微信小程序 省市区选择器实例详解(附源码下载)
2017/01/05 Javascript
Vue filters过滤器的使用方法
2017/07/14 Javascript
Vue2.0学习之详解Vue 组件及父子组件通信
2017/12/12 Javascript
webpack搭建vue 项目的步骤
2017/12/27 Javascript
JS从非数组对象转数组的方法小结
2018/03/26 Javascript
react redux入门示例
2018/04/19 Javascript
代码分析vue中如何配置less
2018/09/28 Javascript
在vue项目实现一个ctrl+f的搜索功能
2020/02/28 Javascript
JQuery通过键盘控制键盘按下与松开触发事件
2020/08/07 jQuery
Python字符编码判断方法分析
2016/07/01 Python
Django rest framework工具包简单用法示例
2018/07/20 Python
Python命令行click参数用法解析
2019/12/19 Python
Python编程快速上手——选择性拷贝操作案例分析
2020/02/28 Python
为什么是 Python -m
2020/06/19 Python
Python + opencv对拍照得到的图片进行背景去除的实现方法
2020/11/18 Python
详解css3 mask遮罩实现一些特效
2018/10/24 HTML / CSS
世界上最大的隐形眼镜商店:1-800 Contacts
2018/11/03 全球购物
总裁岗位职责
2013/12/04 职场文书
小组合作学习反思
2014/02/18 职场文书
体育节口号
2014/06/19 职场文书
端午节活动总结
2014/08/26 职场文书
个人催款函范文
2015/06/24 职场文书
大学毕业生自我鉴定范文
2019/06/21 职场文书
自从在 IDEA 中用了热部署神器 JRebel 之后,开发效率提升了 10(真棒)
2021/06/26 Java/Android
vue项目打包后路由错误的解决方法
2022/04/13 Vue.js