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 相关文章推荐
做网页的一些技巧
Feb 01 Javascript
JQuery SELECT单选模拟jQuery.select.js
Nov 12 Javascript
爆炸式的JS圆形浮动菜单特效代码
Mar 03 Javascript
导航跟随滚动条置顶移动示例代码
Sep 11 Javascript
React.js入门实例教程之创建hello world 的5种方式
May 11 Javascript
深入理解jquery自定义动画animate()
May 24 Javascript
详解JS构造函数中this和return
Sep 16 Javascript
node使用Mongoose类库实现简单的增删改查
Nov 08 Javascript
详解vue2.6插槽更新v-slot用法总结
Mar 09 Javascript
Js代码中的span拼接问题解决
Nov 22 Javascript
Vue项目移动端滚动穿透问题的实现
May 19 Javascript
从0搭建vue-cli4脚手架
Jun 17 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 radio 单选框获取与保持值的实现代码
2010/05/15 PHP
php采集文章中的图片获取替换到本地(实现代码)
2013/07/08 PHP
PHP无限分类(树形类)
2013/09/28 PHP
浅析PHP程序设计中的MVC编程思想
2014/07/28 PHP
JQuery中模拟image的ajaxPrefilter与ajaxTransport处理
2015/06/19 Javascript
JavaScript中数据结构与算法(五):经典KMP算法
2015/06/19 Javascript
el表达式 写入bootstrap表格数据页面的实例代码
2017/01/11 Javascript
jQuery插件HighCharts绘制2D带Label的折线图效果示例【附demo源码下载】
2017/03/08 Javascript
nodejs 图片预览和上传的示例代码
2017/09/30 NodeJs
JavaScript实用代码小技巧
2018/08/23 Javascript
详解Vue之父子组件传值
2019/04/01 Javascript
Vue 3.x+axios跨域方案的踩坑指南
2019/07/04 Javascript
小程序和web画三角形实现解析
2019/09/02 Javascript
Vue-cli assets SubDirectory及PublicPath区别详解
2020/08/18 Javascript
JavaScript实现网页计算器功能
2020/10/29 Javascript
Webpack3+React16代码分割的实现
2021/03/03 Javascript
[00:43]DOTA2小紫本全民票选福利PA至宝全方位展示
2014/11/25 DOTA
[07:20]2018DOTA2国际邀请赛寻真——逐梦Mineski
2018/08/10 DOTA
Tornado Web服务器多进程启动的2个方法
2014/08/04 Python
python判断字符串是否纯数字的方法
2014/11/19 Python
Python中解析JSON并同时进行自定义编码处理实例
2015/02/08 Python
python获取一组汉字拼音首字母的方法
2015/07/01 Python
纯用NumPy实现神经网络的示例代码
2018/10/24 Python
python用fsolve、leastsq对非线性方程组求解
2018/12/15 Python
Python3爬虫之自动查询天气并实现语音播报
2019/02/21 Python
详解python中自定义超时异常的几种方法
2019/07/29 Python
在python中利用try..except来代替if..else的用法
2019/12/19 Python
Python有参函数使用代码实例
2020/01/06 Python
python字符串替换re.sub()实例解析
2020/02/09 Python
Python基于callable函数检测对象是否可被调用
2020/10/16 Python
美国隐形眼镜销售网站:ContactsDirect
2017/10/28 全球购物
比利时香水网上商店:NOTINO
2018/03/28 全球购物
健康教育评估方案
2014/05/25 职场文书
高职教师先进事迹材料
2014/08/24 职场文书
简历自我评价优缺点
2015/03/11 职场文书
2016年党员学习廉政准则心得体会
2016/01/20 职场文书