我知道$parse
和$eval
都会对Angular表达式进行操作。那么为什么Angular团队创建了这两个?
我检查了角度库,$eval
定义如下:
$eval: function(expr, locals) {
return $parse(expr)(this, locals);
}
所以有什么区别:
$parse(expr)(context, locals);
和
$eval: function(expr, locals) {
return $parse(expr)(this, locals);
}
我想知道哪一个是最佳做法?什么时候使用这两个?
答案 0 :(得分:32)
正如你所注意到的,
$parse(expr)($scope, locals)
完全等同于
$scope.$eval(expr, locals)
但是,$parse
比$eval
更具“基本”操作,因此,您可以$parse
一次在一个地方(例如,在compile
函数中指令):
var parsedExpr = $parse(tAttrs.p1);
并在其他地方重复使用(例如,在controller
函数中)
var childScope1 = $scope.$new();
var childScope2 = $scope.$new();
var r1 = parsedExpr(childScope1);
var r2 = parsedExpr(childScope2);
答案 1 :(得分:20)
我认为重要的区别是$eval
是一个scope
方法,它在当前范围内执行表达式,而$parse
是一个(更全局可用的)服务。
因此,您可以使用任何上下文说$parse(expr)(context, locals);
,但在$eval
的情况下,context
将是scope
。
答案 2 :(得分:2)
$ eval幕后使用$ parse来对抗当前范围。
我们说你有
$scope.a = 2;
$scope.b = 4;
$parse("a*b")
为您提供了一个必须根据上下文/对象/范围进行评估才能获得结果的函数。
所以现在
var f = $parse("a*b");
var result = f($scope);
我们正在使用$ parse的输出,这是一个应用于$ scope的函数。
注:
$eval
始终根据当前范围计算表达式并返回结果
示例:console.log($scope.$eval("a*b")); // 8
$parse
只返回该函数,不适用于任何范围。
示例:
var func = $parse("a*b");
现在func
可以应用
任何范围
var result = func($scope);
console.log(result); // 8
对象
var result1 = func({a:3 , b:3});
console.log(result1); // 9
因此可以针对任何范围或对象评估解析过的相同表达式。
如前所述,$eval
角度使用$parse
对照幕后的当前范围来评估表达式并返回结果。
如果您希望为同一个表达式执行多个上下文$parse
是最佳选择。
答案 3 :(得分:0)
“。$ eval()”是一个简单的范围方法,它使用表达式(以及可选的本地),然后使用“$ parse()”对当前范围执行它。
服务“$ parse()”是神奇发生的地方。它需要一个Angular表达式并返回一个函数,该函数有两个参数:“context”和“locals”。后者用于覆盖上下文中设置的变量。背景是关键部分。
store.on('error', function(err) {
console.log(err);
});
或更短:
$scope.foo = 3;
var parseFn = $parse(‘foo = 5’);
parseFn($scope);
$scope.foo; // returns 5