在AngularJS中,我们的确有手动运行模板编译的能力。例如,插值允许基于作用域上的某个条件实时更新文本字符串。
要在字符串模板中做插值操作,需要在你的对象中注入$interpolate服务。在下面的例子中,我们将会将它注入到一个控制器中:
angular.module('myApp',[])
.controller('myController',function($scope,$interpolate){
//我们同时拥有访问$scope、$interpolate服务的权限
}) ;
$interpolate服务是一个可以接受三个参数的函数,其中第一个参数是必需的。
$interpolate服务返回一个函数,用来在特定的上下文中运算表达式。
设置好这些参数后,就可以在控制器中进行字符串插值的操作了。例如,假设我们希望可以在电子邮件的正文中进行实时编辑,当文本发生变化时进行字符插值操作并将结果展示出来。
{{previewText}}
由于控制器内部设置了一个需要每次变化都重新进行字符插值的自定义输入字段,因此需要设置一个$watch来监听数据的变化。为了保证示例的完整性,在这里我们为$watch引入完整的代码。
在控制器中,我们设置了$watch来监视邮件正文的变化,并将emailBody属性的值进行字符插值后的结果赋值给previewText属性。
angular.module('myApp',[])
.controller('myController',function($scope,$interpolate){
$scope.$watch('emailBody',function(body){
var template = $interpolate(body) ;
$scope.previewText = template({to : $scope.to}) ;
})
}) ;
现在,在{{ previewText }}内部的文本中可以将{{ to }}当做一个变量来使用,并对文本的变化进行实时更新。
用startSymbol()方法可以修改标识开始的符号。这个方法接受一个参数。
用endSymbol()方法可以修改标识结束的符号。这个方法也接受一个参数。
如果要修改这两个符号的设置,需要在创建新模块时将$interpolateProvider注入进去。下面我们来创建一个服务:
angular.module('emailParser',[]).config(['$interpolateProvider',function($interpolateProvider){
$interpolateProvider.startSymbol('__') ;
$interpolateProvider.endSymbol('__') ;
}]).factory('EmailParser',['$interpolate',function($interpolate){
//处理解析的服务
return {
parse : function(text,context){
var template = $interpolate(text) ;
return template(context) ;
}
}
}]) ;
现在,我们已经创建了一个模块,可以将它注入到应用中,并在邮件正文的文本中运行这个邮件解析器:
angular.module('myApp', ['emailParser'])
.controller('MyController', ['$scope', 'EmailParser',function($scope, EmailParser) {
// 设置监听
$scope.$watch('emailBody', function(body) {
if (body) {
$scope.previewText = EmailParser.parse(body, {
to: $scope.to
});
}
});
}]);
现在用自定义的 __ 符号取代默认语法中的 {{ }} 符号来请求插值文本。
__ previewText __