1.AngularJS 数据绑定
AngularJS 通过原生的MVC 功能增强了HTML,可以快捷和愉悦的构建出极富表现力的客户端应用。将页面的一部分封装为一个应用,但是并不强迫整个页面都使用AngularJS 进行开发。
要理解数据绑定,必须先理解MVC。MVC是一种软件架构设计模式,它将表现从用户交互中分离出来。AngularJS 应用MVC的组成如下:
- View(视图),即HTML
- Model(模型),当前视图中可用的数据
- Controller(控制器),即JavaScript 函数,可以添加或修改属性
通常,模型包含应用的数据和与数据交互的方法,视图将数据呈现给用户,控制器则是二者之间的桥梁。可以将视图理解为模型状态的映射,当客户端的数据模型改变时,视图就能反映出这些变化,不需要写自定义的代码来实现这个过程。没错,就是这么简单。
这个机制怎么实现的呢?AngularJS 会实时记录数据模型所包含的数据,当AngularJS认为某个值可能发生变化是,就运行自己的事件循环来检查这个值是否变脏,这个事件会调用$digest() 循环。这个过程叫做脏检查(dirty checking)。当有潜在的变化存在时,AngularJS 会在事件循环执行脏检查来保证数据的一致性。这样,不需要构建复杂的JavaScript 功能就能在视图中实现数据自动同步。
1.简单的数据绑定
数据对象是指$scope 对象,是一个简单的JavaScript 对象,它的属性可以被视图访问,也可以同控制器交互。
<!DOCTYPE html>
<!--ng-app声明所有被他包含的元素都属于AngularJS应用-->
<html ng-app>
<head>
<title>Simple app</title>
<!--引入js 文件, 也可以拷本地使用 -->
<script src="https://cdn.bootcss.com/angular.js/1.2.16/angular.min.js"></script>
</script>
</head>
<body>
<!--用ng-model 指令将内部数据模型对象($scope)中的name 属性绑定到文本数据字段上,无论在这里输入了啥都会实时同步到数据模型中-->
<input ng-model="name" type="text" placeholder="Your name">
<!--这里实时地反映出模型的更新-->
<h1>Hello {{ name }}</h1>
</body>
</html>
<!DOCTYPE html>
<html ng-app>
<head>
<meta charset="utf-8">
<!--高版本可能会有问题-->
<script src="https://cdn.bootcss.com/angular.js/1.2.16/angular.min.js"></script>
</head>
<body>
<!--ng-controller 指令声明所有被它包含的元素都属于这个控制器-->
<div ng-controller='MyController'>
<input ng-model="person.name" type="text" placeholder="Your name">
<h1>Hello {{ person.name }}</h1>
<!--这里实时的反映模型的更新-->
<h5>{{ clock }}</h5>
</div>
<script>
function MyController($scope, $timeout) {
var updateClock = function () {
<!--更新$scope 的clock 属性-->
$scope.clock = new Date();
<!--每过一秒调用一次-->
$timeout(function () {
updateClock();
}, 1000);
};
updateClock();
};</script>
</body>
</html>
2.数据绑定的最佳方式
由于JavaScript 自身的特点,以及它在传递值和引用时的不同处理方式。通常认为,在视图中通过对象的属性而不是对象本身来进行引用绑定,是最佳的方式。
function MyController($scope) {
$scope.clock = {
now: new Date()
};
var updateClock = function() {
<!--相比更新$scope.clock, 更新$scope.clock.now 是更好的选择 -->
$scope.clock.now = new Date()
};
setInterval(function() {
$scope.$apply(updateClock);
}, 1000);
updateClock();
};
浙公网安备 33010602011771号