简介
Scope(作用域) 是应用在 HTML (视图) 和 JavaScript (控制器)之间的纽带。
Scope 是一个存储应用数据模型的对象,有可用的方法和属性。
Scope 可应用在视图和控制器上。
作用域是Web应用的控制器和视图之间的粘结剂:
控制器 --> 作用域 --> 视图(DOM)
指令 --> 作用域 --> 视图(DOM)
当你在 AngularJS 创建控制器时,你可以将 $scope 对象当作一个参数传递:
<div ng-controller="myCtrl">
<h1>{{name}}</h1>
</div>
<script>
var app = angular.module('test', []);
app.controller('myCtrl', function($scope) {
$scope.name = "天下行走";
});
</script>
输出结果:天下行走
控制器中创建一个属性名"name"
,对应了视图中使用{{ }}
中的名称。
当在控制器中添加$scope
对象时,视图(HTML)
可以获取了这些属性。
视图中,你不需要添加$scope
前缀, 只需要添加属性名即可,如:{{name}}
。
AngularJS 应用组成如下:
View(视图)
, 即 HTML。
Model(模型)
, 当前视图中可用的数据。
Controller(控制器)
, 即 JavaScript 函数,可以添加或修改属性。
scope
是一个 JavaScript 对象,带有属性
和方法
,这些属性和方法可以在视图和控制器中使用。
再来看个例子:
<div ng-app="myApp" ng-controller="myCtrl">
输入你的名字:
<input ng-model="name">
<h1>{{greeting}}</h1>
<button ng-click='sayHello()'>greet</button>
</div>
<script>
var app = angular.module('myApp', []);
app.controller('myCtrl', function($scope) {
$scope.name = "张三";
$scope.sayHello = function() {
$scope.greeting = $scope.name + '是个笨蛋!';
};
});
</script>
在这个例子中,
- 控制器:
MyCtrl
,它引用了$scope
并在其上注册了两个属性和一个方法 - $scope 对象:持有上面例子所需的数据模型,包括
name
属性、greeting
属性(注:这是在 sayHello() 方法被调用时注册的)
和sayHello()
方法 - 视图:拥有一个输入框、一个按钮以及一个利用双向绑定来显示数据的内容块
那么具体整个示例有这样两个流程,从控制器发起的角度来看就是:
- 控制器往作用域中写属性:
- 给作用域中的
name
赋值,然后作用域通知视图中的input
数据变化了,input
因为通过ng-model
实现了双向绑定可以知道name
的变化,进而在视图中渲染出改变的值
- 给作用域中的
- 控制器往作用域中写方法
- 给作用域中的
sayHello()
方法赋值,该方法被视图中的button
调用,因为button
通过ng-click
绑定了该方法,当用户点击按钮时,sayHello()
被调用,这个方法读取作用域中的name
属性,加上后缀字符串,然后赋值给在作用域中新创建的greeting
属性
- 给作用域中的
整个示例的过程如果从视图的角度看,那主要是以下三个部分:
-
input
中的渲染逻辑:展示了通过ng-model
进行的作用域和 视图中某表单元素的双向绑定- 根据
ng-model
中的name
去作用域中取,如果已经有值,那么用这个默认值填充当前的输入框 - 接受用户输入,并且将用户输入的字符串传给
name
,这时候作用域中的该属性值实时更新为用户输入的值
- 根据
-
button
中的逻辑- 接受用户单击,调用作用域中的
sayHello()
方法
- 接受用户单击,调用作用域中的
-
{{greeting}}
的渲染逻辑- 初始阶段:在用户未单击按钮时,不显示内容
-
取值阶段:在用户单击后,这个表达式会去
scope
中取greeting
属性,而本例中这个作用域和控制器是同一个的,这时候,该作用域下greeting
属性已经有了,这时候这个属性就被取回来了 -
计算阶段:在当前作用域下去计算
greeting
表达式,然后渲染视图,显示张三是个笨蛋!
经过以上的两种角度分析示例过程,我们可以知道:作用域(scope)对象以及其属性是视图渲染的唯一数据来源。
网友评论