$ parse vs $ eval?哪一个是最佳实践?

时间:2015-04-25 21:13:13

标签: angularjs

我知道$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);
      }

我想知道哪一个是最佳做法?什么时候使用这两个?

4 个答案:

答案 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的函数。

注:

  1. $eval始终根据当前范围计算表达式并返回结果 示例:console.log($scope.$eval("a*b")); // 8

  2. $parse只返回该函数,不适用于任何范围。 示例:

    var func = $parse("a*b");
    
  3. 现在func可以应用

    1. 任何范围

      var result = func($scope);
      console.log(result); // 8
      
    2. 对象

      var result1 = func({a:3 , b:3});    
      console.log(result1); // 9
      
    3. 因此可以针对任何范围或对象评估解析过的相同表达式。

      如前所述,$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