AngularJS入门教程之Scope(作用域)


Posted in Javascript onJuly 27, 2016

AngularJS Scope(作用域)

Scope(作用域) 是应用在 HTML (视图) 和 JavaScript (控制器)之间的纽带。

Scope 是一个对象,有可用的方法和属性。

Scope 可应用在视图和控制器上。

如何使用 Scope

当你在 AngularJS 创建控制器时,你可以将 $scope 对象当作一个参数传递:

AngularJS 实例

控制器中的属性对应了视图上的属性:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script>
</head>
<body>

<div ng-app="myApp" ng-controller="myCtrl">

{{carname}}
</div>

<script>
var app = angular.module('myApp', []);
app.controller('myCtrl', function($scope) {
 $scope.carname = "Volvo";
});
</script>

<p>控制器中创建一个属性名 "carname",对应了视图中使用 {{ }} 中的名称。</p>

</body>
</html

运行结果:

Volvo

控制器中创建一个属性名 "carname",对应了视图中使用 {{ }} 中的名称。

当在控制器中添加 $scope 对象时,视图 (HTML) 可以获取了这些属性。

视图中,你不需要添加 $scope 前缀, 只需要添加属性名即可,如: {{carname}}。

Scope 概述

AngularJS 应用组成如下:

View(视图), 即 HTML。

Model(模型), 当前视图中可用的数据。

Controller(控制器), 即 JavaScript 函数,可以添加或修改属性。

scope 是模型。

scope 是一个 JavaScript 对象,带有属性和方法,这些属性和方法可以在视图和控制器中使用。

AngularJS 实例

如果你修改了视图,模型和控制器也会相应更新:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script>
</head>
<body>

<div ng-app="myApp" ng-controller="myCtrl">

<input ng-model="name">
我的名字是 {{name}}

</div>

<script>
var app = angular.module('myApp', []);
app.controller('myCtrl', function($scope) {
 $scope.name = "John Doe";
});
</script>

<p>当你修改输入框中的值时,会影响到模型(model),当然也会影响到控制器对应的属性值。</p>

</body>
</html>

运行结果:

我的名字是 John Doe

当你修改输入框中的值时,会影响到模型(model),当然也会影响到控制器对应的属性值。

Scope 作用范围

了解你当前使用的 scope 是非常重要的。
在以上两个实例中,只有一个作用域 scope,所以处理起来比较简单,但在大型项目中, HTML DOM 中有多个作用域,这时你就需要知道你使用的 scope 对应的作用域是哪一个。

AngularJS 实例

当我们使用 ng-repeat 指令时,每个重复项都访问了当前的重复对象:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script>
</head>
<body>

<div ng-app="myApp" ng-controller="myCtrl">

<ul>
 <li ng-repeat="x in names">{{x}}</li>
</ul>

</div>

<script>
var app = angular.module('myApp', []);

app.controller('myCtrl', function($scope) {
 $scope.names = ["Emil", "Tobias", "Linus"];
});
</script>
	
</body>
</html>

运行结果:

  • Emil
  • Tobias
  • Linus

每个 <li> 元素可以访问当前的重复对象,这里对应的是一个字符串, 并使用变量 x 表示。

根作用域

所有的应用都有一个 $rootScope,它可以作用在 ng-app 指令包含的所有 HTML 元素中。
$rootScope 可作用于整个应用中。是各个 controller 中 scope 的桥梁。用 rootscope 定义的值,可以在各个 controller 中使用。

AngularJS 实例

创建控制器时,将 $rootScope 作为参数传递,可在应用中使用:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script>
</head>
<body>

<div ng-app="myApp" ng-controller="myCtrl">

姓氏为 {{lastname}} 家族成员:
<ul>
 <li ng-repeat="x in names">{{x}} {{lastname}}</li>
</ul>

</div>

<script>
var app = angular.module('myApp', []);

app.controller('myCtrl', function($scope, $rootScope) {
 $scope.names = ["Emil", "Tobias", "Linus"];
 $rootScope.lastname = "Refsnes";
});
</script>

<p>注意 $rootScope 在循环对象内外都可以访问。</p>

</body>
</html>

运行结果:

姓氏为 Refsnes 家族成员:

  • Emil Refsnes
  • Tobias Refsnes
  • Linus Refsnes

注意 $rootScope 在循环对象内外都可以访问。

Javascript 相关文章推荐
基于jquery的一个简单的脚本验证插件
Apr 05 Javascript
JavaScript版TAB选项卡效果实例
Aug 16 Javascript
js格式化时间小结
Nov 03 Javascript
JavaScript中的继承方式详解
Feb 11 Javascript
javascript实现简单的省市区三级联动
May 14 Javascript
js点击文本框弹出可选择的checkbox复选框
Feb 03 Javascript
jQuery中事件与动画的总结分享
May 24 Javascript
功能强大的Bootstrap组件(结合js)
Aug 03 Javascript
vue开发调试神器vue-devtools使用详解
Jul 13 Javascript
详解nuxt路由鉴权(express模板)
Nov 21 Javascript
Javascript 类型转换、封闭函数及常见内置对象操作示例
Nov 15 Javascript
使用vue引入maptalks地图及聚合效果的实现
Aug 10 Javascript
AngularJS入门之动画
Jul 27 #Javascript
JSON格式的时间/Date(2367828670431)/格式转为正常的年-月-日 格式的代码
Jul 27 #Javascript
获取JS中网页各种高宽与位置的方法总结
Jul 27 #Javascript
AngularJS 模型详细介绍及实例代码
Jul 27 #Javascript
jQuery使用serialize()表单序列化时出现中文乱码问题的解决办法
Jul 27 #Javascript
详解Angular开发中的登陆与身份验证
Jul 27 #Javascript
jQuery+css实现非常漂亮的水平导航菜单效果
Jul 27 #Javascript
You might like
PHP函数超时处理方法
2016/02/14 PHP
excel操作之Add Data to a Spreadsheet Cell
2007/06/12 Javascript
js刷新框架子页面的七种方法代码
2008/11/20 Javascript
ie和firefox不兼容的解决方法集合
2009/04/28 Javascript
jquery png 透明解决方案(推荐)
2010/08/21 Javascript
js 幻灯片的实现
2011/12/06 Javascript
基于jquery DOM写的类似微博发布的效果
2012/10/20 Javascript
Js 去掉字符串中的空格(实现代码)
2013/11/19 Javascript
JavaScript代码应该放在HTML代码哪个位置比较好?
2014/10/16 Javascript
Javascript中call和apply函数的比较和使用实例
2015/02/03 Javascript
GitHub上一些实用的JavaScript的文件压缩解压缩库推荐
2016/03/13 Javascript
手机软键盘弹出时影响布局的解决方法
2016/12/15 Javascript
JS优化与惰性载入函数实例分析
2017/04/06 Javascript
简单实现JS上传图片预览功能
2017/04/14 Javascript
angular.js指令中transclude选项及ng-transclude指令详解
2017/05/24 Javascript
详解在vue-cli项目中安装node-sass
2017/06/21 Javascript
ES6顶层对象、global对象实例分析
2019/06/14 Javascript
bootstrap table.js动态填充单元格数据的多种方法
2019/07/18 Javascript
layui radio单选限制下一个radio单选的实例
2019/09/03 Javascript
利用Django-environ如何区分不同环境
2018/08/26 Python
python使用pygame框架实现推箱子游戏
2018/11/20 Python
Pandas时间序列重采样(resample)方法中closed、label的作用详解
2019/12/10 Python
python_array[0][0]与array[0,0]的区别详解
2020/02/18 Python
关于Python Tkinter Button控件command传参问题的解决方式
2020/03/04 Python
如何表示python中的相对路径
2020/07/08 Python
PyTorch 导数应用的使用教程
2020/08/31 Python
加拿大消费电子和手机购物网站:The Source
2017/01/28 全球购物
TUMI马来西亚官方网站:国际领先的高品质商旅箱包品牌
2018/04/26 全球购物
加拿大床上用品、家居装饰、厨房和浴室产品购物网站:Linen Chest
2018/06/05 全球购物
解释一下Windows的消息机制
2014/01/30 面试题
家属慰问信
2015/02/14 职场文书
电影建党伟业观后感
2015/06/01 职场文书
《秦兵马俑》教学反思
2016/02/24 职场文书
redis中lua脚本使用教程
2021/11/01 Redis
python 中的jieba分词库
2021/11/23 Python
java代码实现空间切割
2022/01/18 Java/Android