怎样使用AngularJS作用域
这次给大家带来怎样使用AngularJS作用域,使用AngularJS作用域的注意事项有哪些,下面就是实战案例,一起来看一下。
问题引入
使用 Angular 进行过一段时间的开发后,基本上都会遇到一个这样的坑:
<p ng-controller="TestCtrl"> <p>{{name}}</p> <p ng-if="show"> <input type="text" ng-model="name"> </p> </p> <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. 基本类型变量
<p ng-controller="OuterCtrl"> <p>{{x}}</p> <p ng-controller="InnerCtrl"> <input type="text" ng-model="x"> </p> </p> <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. 引用类型变量
那么,如果上下级作用域想共用变量怎么办呢?
答案是使用引用类型变量。
<p ng-controller="OuterCtrl"> <p>{{x}}</p> <p ng-controller="InnerCtrl"> <input type="text" ng-model="x"> </p> </p> <script> function OuterCtrl($scope){ $scope.data = {}; $scope.data.x = 'hello'; } function InnerCtrl($scope){ } </script>
在这种情况下,两者的 data
是同一个引用,对这个对象上面的属性修改,是可以反映到两级对象上的。
ng-if中的作用域
前面讲的是两级控制器之间的作用域,那跟前面提到的问题有什么关系呢?那个看着不是只有一个 Controller 吗?
其实,并不是只有 Controller 可以创建作用域,ng-if
等指令也会(隐式地)产生新作用域。
总结下来就是,ng-if
、 ng-switch
、 ng-<a href="http://www.php.cn/wiki/137.html" target="_blank">include</a>
等会动态创建一块界面的东西,都是自带一级作用域。
因此,在开发过程中,为了避免模板中的变量歧义,应当尽可能使用命名限定,比如 data.x
,出现歧义的可能性就比单独的 x
要少得多。
相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!
推荐阅读:
以上是怎样使用AngularJS作用域的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

typedef struct 在 C 语言中用于创建结构体类型别名,简化结构体使用。它通过指定结构体别名将一个新的数据类型作为现有结构体的别名。优点包括增强可读性、代码重用和类型检查。注意:在使用别名前必须定义结构体,别名在程序中必须唯一并且仅在其声明的作用域内有效。

Java 中的变量期望值异常可以通过以下方法解决:初始化变量;使用默认值;使用 null 值;使用检查和赋值;了解局部变量的作用域。

JavaScript 闭包的优点包括保持变量作用域、实现模块化代码、延迟执行和事件处理;缺点包括内存泄漏、增加了复杂性、性能开销和作用域链影响。

C++ 中的 #include 预处理器指令将外部源文件的内容插入到当前源文件中,以复制其内容到当前源文件的相应位置。主要用于包含头文件,这些头文件包含代码中需要的声明,例如 #include <iostream> 是包含标准输入/输出函数。

C++智能指针的生命周期:创建:分配内存时创建智能指针。所有权转移:通过移动操作转移所有权。释放:智能指针离开作用域或被明确释放时释放内存。对象销毁:所指向对象被销毁时,智能指针成为无效指针。

可以。C++ 允许函数嵌套定义和调用。外部函数可定义内置函数,内部函数可在作用域内直接调用。嵌套函数增强了封装性、可复用性和作用域控制。但内部函数无法直接访问外部函数的局部变量,且返回值类型需与外部函数声明一致,内部函数不能自递归。

JavaScript 中,this 的指向类型有:1. 全局对象;2. 函数调用;3. 构造函数调用;4. 事件处理程序;5. 箭头函数(继承外层 this)。此外,可以使用 bind()、call() 和 apply() 方法显式设置 this 的指向。

在 Vue 中,let 和 var 声明变量时在作用域上存在差异:作用域:var 具有全局作用域,let 具有块级作用域。块级作用域:var 不创建块级作用域,let 创建块级作用域。重新声明:var 允许在同一作用域内重新声明变量,let 不允许。
