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 相关文章推荐
由prototype_1.3.1进入javascript殿堂-类的初探
Nov 06 Javascript
javascript 二进制运算技巧解析
Nov 27 Javascript
定义JavaScript二维数组采用定义数组的数组来实现
Dec 09 Javascript
javascript仿qq界面的折叠菜单实现代码
Dec 12 Javascript
node.js中的buffer.slice方法使用说明
Dec 10 Javascript
利用CSS3在Angular中实现动画
Jan 15 Javascript
jQuery无刷新上传之uploadify3.1简单使用
Jun 18 Javascript
关于axios返回空对象的问题解决
Apr 04 Javascript
详解如何用babel转换es6的class语法
Apr 03 Javascript
vue+elementui 对话框取消 表单验证重置示例
Oct 29 Javascript
原生Vue 实现右键菜单组件功能
Dec 16 Javascript
如何使用jQuery操作Cookies方法解析
Sep 08 jQuery
轻松理解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+MySQL5.0中文乱码解决方法
2006/11/20 PHP
PHP实现获取文件后缀名的几种常用方法
2015/08/08 PHP
Symfony查询方法实例小结
2017/06/28 PHP
js原型继承的两种方法对比介绍
2014/03/30 Javascript
模拟用户点击弹出新页面不会被浏览器拦截
2014/04/08 Javascript
简单的jquery左侧导航栏和页面选中效果
2014/08/21 Javascript
jquery插件推荐浏览器嗅探userAgent
2014/11/09 Javascript
js实现简单的可切换选项卡效果
2015/04/10 Javascript
jQuery on()方法示例及jquery on()方法的优点
2015/08/27 Javascript
基于jquery实现百度新闻导航菜单滑动动画
2016/03/15 Javascript
jquery mobile界面数据刷新的实现方法
2016/05/28 Javascript
js实现加载更多功能实例
2016/10/27 Javascript
详解nodejs微信公众号开发——6.自定义菜单
2017/04/13 NodeJs
nodejs接入阿里大鱼短信验证码的方法
2017/07/10 NodeJs
原生js 封装get ,post, delete 请求的实例
2017/08/11 Javascript
Node.JS中快速扫描端口并发现局域网内的Web服务器地址(80)
2017/09/18 Javascript
JavaScript复制内容到剪贴板的两种常用方法
2018/02/27 Javascript
jQuery实现适用于移动端的跑马灯抽奖特效示例
2019/01/18 jQuery
layui 图片上传+表单提交+ Spring MVC的实例
2019/09/21 Javascript
JavaScript实现简单的计算器
2020/01/16 Javascript
[01:03:41]DOTA2-DPC中国联赛 正赛 Dynasty vs XG BO3 第三场 2月2日
2021/03/11 DOTA
python使用chardet判断字符串编码的方法
2015/03/13 Python
讲解Python中的递归函数
2015/04/27 Python
深入解析Python中的线程同步方法
2016/06/14 Python
Python实现拷贝多个文件到同一目录的方法
2016/09/19 Python
Python中*args和**kwargs的区别详解
2019/09/17 Python
Pytorch使用MNIST数据集实现CGAN和生成指定的数字方式
2020/01/10 Python
python如何爬取动态网站
2020/09/09 Python
python3爬虫中多线程的优势总结
2020/11/24 Python
意大利在线药房:shop-farmacia.it
2019/03/12 全球购物
祖国在我心中的演讲稿
2014/05/04 职场文书
消防演习通知
2015/04/25 职场文书
2015年大学迎新工作总结
2015/07/16 职场文书
缅怀先烈主题班会
2015/08/14 职场文书
2016年“11.11”光棍节活动总结
2016/04/05 职场文书
使用Apache Camel表达REST服务的方法
2022/06/10 Servers