$ 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);
}
Я хочу знать, какая из них - лучшая практика? и когда использовать эти два?
Ответы
Ответ 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
, это лучший выбор.