AngularJS中的作用域实例分析


Posted in Javascript onMay 16, 2018

本文实例讲述了AngularJS中的作用域。分享给大家供大家参考,具体如下:

问题引入

使用 Angular 进行过一段时间的开发后,基本上都会遇到一个这样的坑:

<div ng-controller="TestCtrl">
 <p>{{name}}</p>
 <div ng-if="show">
  <input type="text" ng-model="name">
 </div>
</div>
<script>
function TestCtrl($scope){
  $scope.show = true;
  $scope.name = 'htf';
}
</script>

p 元素和 input 元素绑定同一个变量,你本以为,在输入框输入内容,p 中显示的肯定也是随之变化的。

然而并不是这样,不管 input 中的元素怎么变, p 元素中的都没变化,WTF。

要说这是什么原因,那就要从 Angular 的作用域说起了。

作用域

每个 Angular 应用默认有一个根作用域 $rootScope, 根作用域位于最顶层,从它往下挂着各级作用域。

通常情况下,页面中 ng-model 绑定的变量都是在对应的 Controller 中定义的。如果一个变量未在当前作用域中定义,JavaScript 会通过当前 Controller 的 prototype 向上查找,也就是作用域的继承。

这又分两种情况。

1. 基本类型变量

<div ng-controller="OuterCtrl">
 <p>{{x}}</p>
 <div ng-controller="InnerCtrl">
  <input type="text" ng-model="x">
 </div>
</div>
<script>
function OuterCtrl($scope){
  $scope.x = 'hello';
}
function InnerCtrl($scope){
}
</script>

运行后会发现跟文章开头一样的问题,里面输入框变了,外面的没跟着变。

原因在于,InnerCtrl 中并未定义 x 这个变量,取值的时候,会沿着原型链向上找,找到了 OuterCtrl 中定义的 x ,然后赋值给自己,在 InnerCtrl 的输入框输入值时,改变的是 InnerCtrl 中的 x ,而对 OuterCtrl 中的 x 无影响。此时,两个 x 是独立的。

不过,如果你不嫌麻烦的话,用 $scope.$parent 可以绑定并影响上一层作用域中的基本变量:

<input type="text" ng-model="$parent.x">

2. 引用类型变量

那么,如果上下级作用域想共用变量怎么办呢?

答案是使用引用类型变量。

<div ng-controller="OuterCtrl">
 <p>{{x}}</p>
 <div ng-controller="InnerCtrl">
  <input type="text" ng-model="x">
 </div>
</div>
<script>
function OuterCtrl($scope){
  $scope.data = {};
  $scope.data.x = 'hello';
}
function InnerCtrl($scope){
}
</script>

在这种情况下,两者的 data 是同一个引用,对这个对象上面的属性修改,是可以反映到两级对象上的。

ng-if中的作用域

前面讲的是两级控制器之间的作用域,那跟前面提到的问题有什么关系呢?那个看着不是只有一个 Controller 吗?

其实,并不是只有 Controller 可以创建作用域,ng-if 等指令也会(隐式地)产生新作用域。

总结下来就是,ng-ifng-switchng-include 等会动态创建一块界面的东西,都是自带一级作用域。

因此,在开发过程中,为了避免模板中的变量歧义,应当尽可能使用命名限定,比如 data.x,出现歧义的可能性就比单独的 x 要少得多。

总结

始终将页面中的元素绑定到对象的属性(data.x)而不是 直接绑定到基本变量(x)上。

希望本文所述对大家AngularJS程序设计有所帮助。

Javascript 相关文章推荐
jquery tab标签页的制作
May 10 Javascript
javascript 防止刷新,后退,关闭
Aug 07 Javascript
让innerText在firefox火狐和IE浏览器都能用的写法
May 14 Javascript
图片延迟加载的实现代码(模仿懒惰)
Mar 29 Javascript
浅谈jQuery animate easing的具体使用方法(推荐)
Jun 17 Javascript
js实现图片缓慢放大缩小效果
Aug 02 Javascript
echarts3 使用总结(绘制各种图表,地图)
Jan 05 Javascript
详解a++和++a的区别
Aug 30 Javascript
2种简单的js倒计时方式
Oct 20 Javascript
JSONP原理及应用实例详解
Sep 13 Javascript
jquery 回调操作实例分析【回调成功与回调失败的情况】
Sep 27 jQuery
详解如何在Javascript和Sass之间共享变量
Nov 13 Javascript
element-ui 限制日期选择的方法(datepicker)
May 16 #Javascript
npm 更改默认全局路径以及国内镜像的方法
May 16 #Javascript
详解使用create-react-app快速构建React开发环境
May 16 #Javascript
seajs下require书写约定实例分析
May 16 #Javascript
Vue使用高德地图搭建实时公交应用功能(地图 + 附近站点+线路详情 + 输入提示+换乘详情)
May 16 #Javascript
基于Vue2x实现响应式自适应轮播组件插件VueSliderShow功能
May 16 #Javascript
vue input 输入校验字母数字组合且长度小于30的实现代码
May 16 #Javascript
You might like
php自定义hash函数实例
2015/05/05 PHP
PHP在linux上执行外部命令的方法
2017/02/06 PHP
PHP 范围解析操作符(::)用法分析【访问静态成员和类常量】
2020/04/14 PHP
jscript之List Excel Color Values
2007/06/13 Javascript
js+html+css实现鼠标移动div实例
2013/01/30 Javascript
javascript中的document.open()方法使用介绍
2013/10/09 Javascript
用html+css+js实现的一个简单的图片切换特效
2014/05/28 Javascript
jQuery实现模拟marquee标签效果
2015/07/14 Javascript
详解参数传递四种形式
2015/07/21 Javascript
网页收藏夹显示ICO图标(代码少)
2015/08/04 Javascript
javascript中Array()数组函数详解
2015/08/23 Javascript
在Docker快速部署Node.js应用的详细步骤
2016/09/02 Javascript
利用纯Vue.js构建Bootstrap组件
2016/11/03 Javascript
jQuery实现标签页效果实战(4)
2017/02/08 Javascript
VUE长按事件需求详解
2017/10/18 Javascript
浅谈在vue中用webpack打包之后运行文件的问题以及相关配置方法
2018/02/21 Javascript
从零开始搭建vue移动端项目到上线的步骤
2018/10/15 Javascript
深入浅析vue中cross-env的使用
2019/09/12 Javascript
浅析vue中的provide / inject 有什么用处
2019/11/10 Javascript
python格式化字符串实例总结
2014/09/28 Python
Python中循环引用(import)失败的解决方法
2018/04/22 Python
对pandas中Series的map函数详解
2018/07/25 Python
Python使用os.listdir()和os.walk()获取文件路径与文件下所有目录的方法
2019/04/01 Python
在PyCharm的 Terminal(终端)切换Python版本的方法
2019/08/02 Python
python 提取文件指定列的方法示例
2019/08/07 Python
Python 中Operator模块的使用
2021/01/30 Python
Python爬虫爬取ts碎片视频+验证码登录功能
2021/02/22 Python
赫里福德的一家乡村零售商店:Philip Morris & Son
2017/06/25 全球购物
采购文员岗位职责
2013/11/20 职场文书
庆祝教师节活动方案
2014/01/31 职场文书
物流管理专业推荐信
2014/09/06 职场文书
中小学校园安全广播稿
2014/09/29 职场文书
家庭困难证明
2014/10/12 职场文书
教师党的群众路线教育实践活动学习心得体会
2014/10/30 职场文书
运动会宣传稿100字
2015/07/23 职场文书
最新农村养殖致富:资金投入较低的创业项目有哪些?
2019/09/26 职场文书