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 相关文章推荐
解决 firefox 不支持 document.all的方法
Mar 12 Javascript
Jquery iframe内部出滚动条
Feb 11 Javascript
javascript闭包的理解和实例
Aug 12 Javascript
JS无限树状列表实现代码
Jan 11 Javascript
理清apply(),call()的区别和关系
Aug 14 Javascript
Ubuntu系统下Angularjs开发环境安装
Sep 01 Javascript
Angular 理解module和injector,即依赖注入
Sep 07 Javascript
Vuejs入门教程之Vue生命周期,数据,手动挂载,指令,过滤器
Apr 19 Javascript
记一次webapck4 配置文件无效的解决历程
Sep 19 Javascript
2种在vue项目中使用百度地图的简单方法
Sep 28 Javascript
js实现上传图片并显示图片名称
Dec 18 Javascript
vue实现可拖拽的dialog弹框
May 13 Vue.js
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+SQL 注入攻击的技术实现以及预防办法
2010/12/29 PHP
php过滤敏感词的示例
2014/03/31 PHP
PHP中的替代语法简介
2014/08/22 PHP
PDO预处理语句PDOStatement对象使用总结
2014/11/20 PHP
WordPress中获取所使用的模板的页面ID的简单方法
2015/12/31 PHP
PHP实现一维数组与二维数组去重功能示例
2018/05/24 PHP
PHP常量define和const的区别详解
2019/05/18 PHP
php字符串过滤strip_tags()函数用法实例分析
2019/06/24 PHP
google jQuery 引用文件,jQuery 引用地址集合(jquery 1.2.6至jquery1.5.2)
2011/04/24 Javascript
jQuery .tmpl(), .template()学习资料小结
2011/07/18 Javascript
IE与Firefox在JavaScript上的7个不同句法分享
2011/10/30 Javascript
利用jquery包将字符串生成二维码图片
2013/09/12 Javascript
jquery的父子兄弟节点查找示例代码
2014/03/03 Javascript
浅谈EasyUi ComBotree树修改 父节点选择的问题
2016/11/07 Javascript
Jquery Easyui表单组件Form使用详解(30)
2016/12/19 Javascript
Angular CLI 安装和使用教程
2017/09/13 Javascript
vue-cli 自定义指令directive 添加验证滑块示例
2017/10/19 Javascript
vue.js根据代码运行环境选择baseurl的方法
2018/02/28 Javascript
微信小程序实现点击效果
2019/06/21 Javascript
微信小程序如何调用新闻接口实现列表循环
2019/07/02 Javascript
python提示No module named images的解决方法
2014/09/29 Python
实例解析Python设计模式编程之桥接模式的运用
2016/03/02 Python
Python实现注册登录系统
2017/08/08 Python
Django中使用Celery的方法示例
2018/11/29 Python
Python3爬虫全国地址信息
2019/01/05 Python
python循环定时中断执行某一段程序的实例
2019/06/29 Python
python Django中models进行模糊查询的示例
2019/07/18 Python
Django 静态文件配置过程详解
2019/07/23 Python
python numpy矩阵信息说明,shape,size,dtype
2020/05/22 Python
html5 worker 实例(二) 图片变换效果
2013/06/24 HTML / CSS
用html5实现语音搜索框的方法
2014/03/18 HTML / CSS
爱淘宝:淘宝网购物分享平台
2017/04/28 全球购物
Kaufmann Mercantile官网:家居装饰、配件、户外及更多
2018/09/28 全球购物
体育专业个人的求职信范文
2013/09/21 职场文书
2015中秋节慰问信范文
2015/03/23 职场文书
退休劳动合同怎么写?
2019/10/25 职场文书