AngularJS的初学者经常会对$parse和$eval两个内建服务感到有些困惑,今天咱们就来讲说AngularJS中的$parse和$eval。express
总的来讲,$parse和$eval都是做用于AngularJS的表达式。app
什么是表达式?
AngularJS中的表达式就是一些相似于JavaScript代码的代码片断(可是它们和JavaScript代码有不尽相同)。表达式一般被用来防止在绑定中,例如{{expression}}。下面是一个例子:函数
1 + 2 = {{ 1 + 2 }}
或者:对象
My name is {{ user.name }}
$parse服务
$parse服务能够讲一个表达式转换为一个函数。这个函数能够被调用,其中的参数是一个上下文对象,一般来讲是做用域。ip
另外,经过$parse的表达式返回的这个函数有一个assign属性。这个assign属性也是一个函数,它能够用来在给定的上下文中改变这个表达式的值。作用域
下面是一段简单的代码:io
<div my-attr="obj.name" my-directive>testing</div>function
app.directive('myDirective',function($log,$parse){
return function(scope,elem,attrs){
//解析"my-attr属性值到一个函数中"
var model = $parse(attrs.myAttr);
//model如今是一个函数,能够调用它来获取表达式的值
//下面这行代码将会输出做用域中obj.name的值
$log.log(model(scope));test
elem.bind('click',function(){
//'model.assign'也是一个函数,它用来更新表达式的值
model.assign(scope,'New name');
scope.$apply();
})
}
});
上面的例子能够充分体现咱们为何须要$parse服务。若是属性值是name,那么咱们彻底能够不用$parse,只用scope[attrs.myAttr]便可。可是在上面的例子中,方括号并无论用。cli
$eval服务
$eval是一个做用域scope中的方法,它将会在当前做用域中执行一个表达式并返回结果:
scope.a = 1;
scope.b = 2;
scope.$eval('a+b'); // 3