Подтвердить что ты не робот

$ parse vs $eval? какой из них лучше?

Я знаю, что $parse и $eval работают на выражениях Angular. Почему команда 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);
      }

Я хочу знать, какая из них - лучшая практика? и когда использовать эти два?

4b9b3361

Ответ 1

Как вы заметили,

$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);

Ответ 2

Я думаю, что важным отличием является то, что $eval - это метод scope, который выполняет выражение в текущей области, а $parse - это (более глобально доступная) служба.

Итак, вы можете сказать $parse(expr)(context, locals);, с любым контекстом, но в случае $eval context будет scope.

Ответ 3

$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 angular для > используется $parse для текущей области за кулисами, чтобы оценить выражение и вернуть результат.

Если вы хотите, чтобы несколько контекстов выполнялись для одного и того же выражения $parse, это лучший выбор.