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 相关文章推荐
通过Unicode转义序列来加密,按你说的可以算是混淆吧
May 06 Javascript
使用 JScript 创建 .exe 或 .dll 文件的方法
Jul 13 Javascript
javascript中sort() 方法使用详解
Aug 30 Javascript
浅谈使用MVC模式进行JavaScript程序开发
Nov 10 Javascript
JavaScript驾驭网页-DOM
Mar 24 Javascript
jQuery Validate插件实现表单验证
Aug 19 Javascript
利用forever和pm2部署node.js项目过程
May 10 Javascript
在Vue中如何使用Cookie操作实例
Jul 27 Javascript
微信小程序项目实践之主页tab选项实现
Jul 18 Javascript
Element UI 自定义正则表达式验证方法
Sep 04 Javascript
Vue.extend实现挂载到实例上的方法
May 01 Javascript
JavaScript canvas仿代码流瀑布
Feb 10 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
全国FM电台频率大全 - 29 青海省
2020/03/11 无线电
php下使用以下代码连接并测试
2008/04/09 PHP
PHP里的中文变量说明
2011/07/23 PHP
PHP独立Session数据库存储操作类分享
2014/06/11 PHP
php中用memcached实现页面防刷新功能
2014/08/19 PHP
php正则表达式学习笔记
2015/11/13 PHP
PHP图形操作之Jpgraph学习笔记
2015/12/25 PHP
ThinkPHP使用Smarty第三方插件方法小结
2016/03/19 PHP
Prototype使用指南之form.js
2007/01/10 Javascript
javascript 定义初始化数组函数
2009/09/07 Javascript
ExtJs Excel导出并下载IIS服务器端遇到的问题
2011/09/16 Javascript
setTimeout的延时为0时多个浏览器的区别
2012/05/23 Javascript
Javascript事件实例详解
2013/11/06 Javascript
jquery+json实现数据列表分页示例代码
2013/11/15 Javascript
json中换行符的处理方法示例介绍
2014/06/10 Javascript
JavaScript实现的双向跨域插件分享
2015/01/31 Javascript
javascript 继承学习心得总结
2016/03/17 Javascript
Bootstrap CSS组件之按钮下拉菜单
2016/12/17 Javascript
Vue input控件通过value绑定动态属性及修饰符的方法
2017/05/03 Javascript
vue router学习之动态路由和嵌套路由详解
2017/09/21 Javascript
vue里面v-bind和Props 利用props绑定动态数据的方法
2018/08/27 Javascript
layer.prompt输入层的例子
2019/09/24 Javascript
Python操作MySQL模拟银行转账
2018/03/12 Python
tensorflow 恢复指定层与不同层指定不同学习率的方法
2018/07/26 Python
selenium使用chrome浏览器测试(附chromedriver与chrome的对应关系表)
2018/11/29 Python
安装2019Pycharm最新版本的教程详解
2019/10/22 Python
国际书籍零售商:Wordery
2017/11/01 全球购物
override和overload的区别
2016/03/09 面试题
建筑施工实习自我鉴定
2013/09/19 职场文书
研讨会主持词
2014/04/02 职场文书
出租房屋协议书
2014/09/14 职场文书
司法局群众路线教育实践活动整改措施思想汇报
2014/10/13 职场文书
导游词之崇武古城
2019/10/07 职场文书
基于MySql验证的vsftpd虚拟用户
2021/11/07 MySQL
千万级用户系统SQL调优实战分享
2022/03/03 MySQL
javascript之Object.assign()的痛点分析
2022/03/03 Javascript