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 15 Javascript
原生js 秒表实现代码
Jul 24 Javascript
js字符串截取函数substr substring slice使用对比
Nov 27 Javascript
jQuery过滤选择器用法分析
Feb 10 Javascript
JQuery基础语法小结
Feb 27 Javascript
javascript实现粘贴qq截图功能(clipboardData)
May 29 Javascript
JS常用字符串方法(推荐)
Jan 15 Javascript
Jquery 整理元素选取、常用方法一览表
Nov 26 Javascript
了解VUE的render函数的使用
Jun 08 Javascript
浅谈vue 单文件探索
Sep 05 Javascript
Vue中rem与postcss-pxtorem的应用详解
Nov 20 Javascript
echarts柱状图背景重叠组合而非并列的实现代码
Dec 10 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计算两个坐标(经度,纬度)之间距离的方法
2015/04/17 PHP
PHP实现找出链表中环的入口节点
2018/01/16 PHP
PHP的HTTP客户端Guzzle简单使用方法分析
2019/10/30 PHP
kmock javascript 单元测试代码
2011/02/06 Javascript
ExtJS4 动态生成的grid导出为excel示例
2014/05/02 Javascript
javascript实现的简单的表单验证
2015/07/10 Javascript
javascript中Date对象应用之简易日历实现
2016/07/12 Javascript
jQuery插件WebUploader实现文件上传
2016/11/07 Javascript
深入理解ES6的迭代器与生成器
2017/08/19 Javascript
react build 后打包发布总结
2018/08/24 Javascript
解决IE11 vue +webpack 项目中数据更新后页面没有刷新的问题
2018/09/25 Javascript
vue自定义js图片碎片轮播图切换效果的实现代码
2019/04/28 Javascript
vue video和vue-video-player实现视频铺满教程
2020/10/30 Javascript
使用Python对Csv文件操作实例代码
2017/05/12 Python
python中模块查找的原理与方法详解
2017/08/11 Python
Django学习教程之静态文件的调用详解
2018/05/08 Python
Python简单获取二维数组行列数的方法示例
2018/12/21 Python
python3.6中@property装饰器的使用方法示例
2019/08/17 Python
django序列化serializers过程解析
2019/12/14 Python
Django视图、传参和forms验证操作
2020/07/15 Python
Python-split()函数实例用法讲解
2020/12/18 Python
selenium学习教程之定位以及切换frame(iframe)
2021/01/04 Python
pycharm 多行批量缩进和反向缩进快捷键介绍
2021/01/15 Python
Adobe Html5 Extension开发初体验图文教程
2017/11/14 HTML / CSS
原生 JS+CSS+HTML 实现时序图的方法
2019/07/31 HTML / CSS
澳大利亚领先的皮肤诊所:Skin Matrix(抗衰老、痤疮专家、药妆护肤)
2018/05/20 全球购物
介绍一些UNIX常用简单命令
2014/11/11 面试题
信息部岗位职责
2013/11/12 职场文书
运动员口号
2014/06/09 职场文书
群众路线党员个人剖析材料
2014/10/08 职场文书
党员干部四风问题整改措施思想汇报
2014/10/12 职场文书
党员示范岗材料
2014/12/19 职场文书
房产电话营销开场白
2015/05/29 职场文书
士兵突击观后感
2015/06/16 职场文书
导游词书写之黄山
2019/08/06 职场文书
Windows Server 2019 安装DHCP服务及相关配置
2022/04/28 Servers