5.表达式
1.概述
用{{ }} 将一个变量绑定到$scope 上的写法本质上就是一个表达式:{{expression}}。当用$watch 监听时,AngularJS 会对表达式或函数进行运算。
AngularJS 的表达式有以下显著特性:
- 所有表达式又在其所属的作用域内部执行,有访问本地$scope 的权限
- 表达式发生TypeError 和ReferenceError 不会抛出异常
- 不能使用任何流程控制语句(条件控制,例如if/else)
- 可以接受过滤器和过滤器链
对表达式进行的任何操作,都会在其所属的作用域内部执行,所以可以在表达式内部调用那些限制在此作用域内的变量,并进行循环、函数调用、将变量应用到数学表达式中等操作。
2.解析表达式
AngularJS 会在运行$digest 循环的过程中自动解析表达式,但有时候手动解析也是有用的。
AngularJS 通过$parse 这个内部服务来进行表达式的运算,这个服务能够访问当前所处的作用域。这个过程允许我们访问定义在$scope 上的原始JavaScript 数据和函数。
将$scope 服务注入到控制器中,然后调用它就可以实现手动解析表达式。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script src="https://cdn.bootcss.com/angular.js/1.5.8/angular.min.js"></script>
</head>
<body>
<div ng-app="myApp">
<div ng-controller="MyController">
Name:
<input ng-model="expr"
type="text"
placeholder="Enter name" />
<h2>{{ parsedValue }}</h2>
</div>
</div>
<script>
angular.module("myApp", [])
.controller('MyController',
function ($scope, $parse) {
//$watch(watchExpression, listener, objectEquality) 是一个scope 函数,用于监听模型变化
//参数:watchExpression: 监听对象,可以是表达式如'expr', 或函数如function(){return $scope.name}
// listener: 回调函数,接收三个参数:newValue(新值), oldValue(旧值), scope(作用域的引用)
// objectEquality:是否深度监听,如果设置为true,它告诉Angular检查所监控的对象中每一个属性的变化
$scope.$watch('expr', function (newVal, oldVal, scope) {
if (newVal != oldVal) {
var context = {
name: newVal
};
//注意格式,不小心就要吃没文化的亏
var expression = "'Hello '+ name";
//用该表达式设置parseFun
var parseFun = $parse(expression);
// 获取经过解析后表达式的值
$scope.parsedValue = parseFun(context);
}
});
});
</script>
</body>
</html>
3.插值字符串
要在字符串模板中做插值操作,需要注入$interpolate 服务,如下所示。
angular.module('myApp'[]).controller('myController',function($scope,$interpolate){
//同时拥有访问$scope 和$interpolate 服务的权限
});
$interpolate 服务接收3个参数,第一个必须,后面两个可省略。
text(字符串):一个包含字符插值的字符串。
mustHaveExpresson(布尔型):如果将这个参数设为true,当传入的字符串不含有表达式时会返回null。
trustedContext(字符串):AngularJS 会对已经进行过字符插值操作的字符串通过$sec.getTrusted() 方法进行严格的上下文转义。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script src="https://cdn.bootcss.com/angular.js/1.4.6/angular.min.js"></script>
</head>
<body>
<div ng-app="myApp">
<div ng-controller="MyController">
Email:
<input ng-model="to"
type="email"
placeholder="Recipient" />
<textarea ng-model="emailBody"></textarea>
<!--pre 元素可定义预格式化的文本。被包围在 pre 元素中的文本通常会保留空格和换行符。而文本也会呈现为等宽字体。
<pre> 标签的一个常见应用就是用来表示计算机的源代码。-->
<pre>{{previewText}}</pre>
</div>
</div>
<script>
angular.module("myApp", []).controller('MyController',function ($scope, $interpolate) {
//设置监听emailBody
$scope.$watch('emailBody', function (newVal, oldVal, scope) {
if (newVal) {
var template = $interpolate(newVal);
//在控件emailBody 中输入"{{tototo}} "就相当于$scope.to 的变量
$scope.previewText = template({ tototo: $scope.to });
}
});
});
</script>
</body>
</html>
结果如下:

浙公网安备 33010602011771号