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 相关文章推荐
javascript优先加载笔记代码
Sep 30 Javascript
为Extjs加加速(javascript加速)
Aug 19 Javascript
23个Javascript弹出窗口特效整理
Feb 25 Javascript
基于jQuery的可用于选项卡及幻灯的切换插件
Mar 28 Javascript
JavaScript中的isXX系列是否继续使用的分析
Apr 16 Javascript
jquery序列化表单去除指定元素示例代码
Apr 10 Javascript
JavaScript中的变量作用域介绍
Dec 31 Javascript
js操作数据库实现注册和登陆的简单实例
May 26 Javascript
相册展示PhotoSwipe.js插件实现
Aug 25 Javascript
Angular.Js之Scope作用域的学习教程
Apr 27 Javascript
JavaScript数据类型和变量_动力节点Java学院整理
Jun 26 Javascript
javascript实现小型区块链功能
Apr 03 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
DC《神奇女侠2》因疫情推迟上映 温子仁新恐怖片《恶性》撤档
2020/04/09 欧美动漫
php图像处理函数大全(推荐收藏)
2013/07/11 PHP
WordPress中用于获取文章信息以及分类链接的函数用法
2015/12/18 PHP
基于PHP实现数据分页显示功能
2016/05/26 PHP
PHP架构及原理知识点详解
2019/12/22 PHP
javaScript checkbox 全选/反选及批量删除
2010/04/28 Javascript
理解JSON:3分钟课程
2011/10/28 Javascript
Knockoutjs快速入门(经典)
2012/12/24 Javascript
javascript打印输出json实例
2013/11/11 Javascript
js动态拼接正则表达式的两种方法
2014/03/04 Javascript
jQuery构造函数init参数分析
2015/05/13 Javascript
JS定时器使用,定时定点,固定时刻,循环执行详解
2016/05/31 Javascript
javascript 分号总结及详细介绍
2016/09/24 Javascript
js导出excel文件的简洁方法(推荐)
2016/11/02 Javascript
老生常谈js-react组件生命周期
2017/05/02 Javascript
Angular.Js中ng-include指令的使用与实现
2017/05/07 Javascript
微信小程序实现滑动删除效果
2017/05/19 Javascript
angularjs中ng-bind-html的用法总结
2017/05/23 Javascript
Element UI 自定义正则表达式验证方法
2018/09/04 Javascript
ES6的循环与可迭代对象示例详解
2021/01/31 Javascript
python self,cls,decorator的理解
2009/07/13 Python
python中sys.argv参数用法实例分析
2015/05/20 Python
python递归删除指定目录及其所有内容的方法
2017/01/13 Python
Python编程实现二分法和牛顿迭代法求平方根代码
2017/12/04 Python
Numpy数组转置的两种实现方法
2018/04/17 Python
python3 爬取图片的实例代码
2018/11/06 Python
Python绘制热力图示例
2019/09/27 Python
python线程池如何使用
2020/05/28 Python
Java中的类包括什么内容?设计时要注意哪些方面
2012/05/23 面试题
爱国主义教育演讲稿
2014/08/26 职场文书
合作经营协议书范本
2014/09/16 职场文书
质检员工作总结2015
2015/04/25 职场文书
男人帮观后感
2015/06/18 职场文书
公司员工奖惩制度
2015/08/04 职场文书
MySQL中in和exists区别详解
2021/06/03 MySQL
Python中异常处理用法
2021/11/27 Python