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 相关文章推荐
jQuery 实现侧边浮动导航菜单效果
Dec 26 Javascript
JavaScript判断数组是否包含指定元素的方法
Jul 01 Javascript
jQuery实现非常实用漂亮的select下拉菜单选择效果
Nov 06 Javascript
jQuery插件ImageDrawer.js实现动态绘制图片动画(附源码下载)
Feb 25 Javascript
基于JavaScript实现添加到购物车效果附源码下载
Aug 22 Javascript
浅谈js原生拖放
Nov 21 Javascript
使用BootStrap实现悬浮窗口的效果
Dec 13 Javascript
仿淘宝JSsearch搜索下拉深度用法
Jan 15 Javascript
JS实现520 表白简单代码
May 21 Javascript
vue el-table实现自定义表头
Dec 11 Javascript
JS检索下拉列表框中被选项目的索引号(selectedIndex)
Dec 17 Javascript
基于Element的组件改造的树形选择器(树形下拉框)
Feb 27 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
Codeigniter注册登录代码示例
2014/06/12 PHP
php json转换相关知识(小结)
2018/12/21 PHP
Laravel5框架自定义错误页面配置操作示例
2019/04/17 PHP
微信公众号之主动给用户发送消息功能
2019/06/22 PHP
jQuery对象[0]是什么含义?
2010/07/31 Javascript
父子窗体间传递JSON格式的数据的代码
2010/12/25 Javascript
jQuery选择器全面总结
2014/01/06 Javascript
jquery.fastLiveFilter.js实现输入自动过滤的方法
2015/08/11 Javascript
jQuery 选择器(61种)整理总结
2016/09/26 Javascript
javascript工厂模式和构造函数模式创建对象方法解析
2016/12/30 Javascript
JavaScript组件开发之输入框加候选框
2017/03/10 Javascript
微信小程序实现团购或秒杀批量倒计时
2020/11/01 Javascript
微信小程序methods中定义的方法互相调用的实例代码
2018/08/07 Javascript
vue单页面实现当前页面刷新或跳转时提示保存
2018/11/02 Javascript
JavaScript实现鼠标经过表格某行时此行变色
2020/11/20 Javascript
Python中Random和Math模块学习笔记
2015/05/18 Python
Python中运算符&quot;==&quot;和&quot;is&quot;的详解
2016/10/08 Python
windows上安装Anaconda和python的教程详解
2017/03/28 Python
python生成lmdb格式的文件实例
2018/11/08 Python
把pandas转换int型为str型的方法
2019/01/29 Python
Python jieba库用法及实例解析
2019/11/04 Python
python使用正则表达式(Regular Expression)方法超详细
2019/12/30 Python
关于win10在tensorflow的安装及在pycharm中运行步骤详解
2020/03/16 Python
Selenium常见异常解析及解决方案示范
2020/04/10 Python
Python虚拟环境的创建和使用详解
2020/09/07 Python
Flask-SocketIO服务端安装及使用代码示例
2020/11/26 Python
CSS3制作气泡对话框的实例教程
2016/05/10 HTML / CSS
CSS 3.0 结合video视频实现的创意开幕效果
2020/06/01 HTML / CSS
含精油的天然有机化妆品:Indemne
2019/08/27 全球购物
优秀毕业大学生推荐信
2013/11/13 职场文书
国贸专业的职业规划范文
2014/01/23 职场文书
结婚保证书范文
2014/04/29 职场文书
2014年药店店长工作总结
2014/11/17 职场文书
索赔员岗位职责
2015/02/15 职场文书
民主生活会主持词
2015/07/01 职场文书
2016党员干部反腐倡廉心得体会
2016/01/13 职场文书