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 相关文章推荐
使用CSS和jQuery模拟select并附提交后取得数据的代码
Oct 18 Javascript
jQuery拖拽排序插件制作拖拽排序效果(附源码下载)
Feb 23 Javascript
Fullpage.js固定导航栏-实现定位导航栏
Mar 17 Javascript
详解Angular开发中的登陆与身份验证
Jul 27 Javascript
JS实现移动端判断上拉和下滑功能
Aug 07 Javascript
Vue多种方法实现表头和首列固定的示例代码
Feb 02 Javascript
JS获取url参数,JS发送json格式的POST请求方法
Mar 29 Javascript
利用Node.js批量抓取高清妹子图片实例教程
Aug 02 Javascript
基于VUE实现的九宫格抽奖功能
Sep 30 Javascript
微信小程序 JS动态修改样式的实现方法
Dec 16 Javascript
js如何获取访问IP、地区、当前操作浏览器
Jul 23 Javascript
js将日期格式转换为YYYY-MM-DD HH:MM:SS
Sep 18 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和MySql来与ODBC数据连接
2006/10/09 PHP
php环境套包 dedeampz 伪静态设置示例
2014/03/26 PHP
php计算税后工资的方法
2015/07/28 PHP
分享一个漂亮的php验证码类
2016/09/29 PHP
基于CI(CodeIgniter)框架实现购物车功能的方法
2018/04/09 PHP
PHP如何根据文件头检测文件类型实例代码
2018/10/14 PHP
jquery通过closest选择器修改上级元素的方法
2015/03/17 Javascript
BOM系列第一篇之定时器setTimeout和setInterval
2016/08/17 Javascript
利用JS判断字符串是否含有数字与特殊字符的方法小结
2016/11/25 Javascript
防止重复发送 Ajax 请求
2017/02/15 Javascript
JS中LocalStorage与SessionStorage五种循序渐进的使用方法
2017/07/12 Javascript
jQuery实现模糊搜索功能的方法分析
2018/06/29 jQuery
vue2 中二级路由高亮问题及配置方法
2019/06/10 Javascript
改进 JavaScript 和 Rust 的互操作性并深入认识 wasm-bindgen 组件
2019/07/13 Javascript
uni-app如何实现增量更新功能
2020/01/03 Javascript
详解JS函数防抖
2020/06/05 Javascript
移动端JS实现拖拽两种方法解析
2020/10/12 Javascript
收集的几个Python小技巧分享
2014/11/22 Python
python 数据清洗之数据合并、转换、过滤、排序
2017/02/12 Python
在windows下Python打印彩色字体的方法
2018/05/15 Python
django 邮件发送模块smtp使用详解
2019/07/22 Python
django rest framework 自定义返回方式
2020/07/12 Python
python 将Excel转Word的示例
2021/03/02 Python
CSS3实现DIV圆角效果完整代码
2012/10/10 HTML / CSS
html5 video标签屏蔽右键视频另存为的js代码
2013/11/12 HTML / CSS
欧洲最大的球衣网上商店:Kitbag
2017/11/11 全球购物
幼儿教师个人求职信范文
2013/09/21 职场文书
教育专业自荐书范文
2013/12/17 职场文书
教师一岗双责责任书
2014/04/16 职场文书
《悯农》教学反思
2014/04/28 职场文书
企业宣传策划方案
2014/05/29 职场文书
授权委托书范文
2014/07/31 职场文书
基层党员群众路线教育实践活动个人对照检查材料思想汇报
2014/10/05 职场文书
先进班组材料范文
2014/12/25 职场文书
2015年世界卫生日活动总结
2015/02/09 职场文书
2016北大自主招生自荐信模板
2016/01/28 职场文书