Quelle est la différence entre $parse
, $interpolate
et les $compile
services? Pour moi, ils font tous la même chose: prendre un template et le compiler en template-function.
Quelle est la différence entre $parse
, $interpolate
et les $compile
services? Pour moi, ils font tous la même chose: prendre un template et le compiler en template-function.
Réponses:
Ce sont tous des exemples de services qui facilitent le rendu des vues AngularJS (bien que $parse
et $interpolate
puissent être utilisés en dehors de ce domaine). Pour illustrer le rôle de chaque service, prenons l'exemple de ce morceau de HTML:
var imgHtml = '<img ng-src="/path/{{name}}.{{extension}}">'
et valeurs sur la portée:
$scope.name = 'image';
$scope.extension = 'jpg';
Compte tenu de ce balisage, voici ce que chaque service apporte à la table:
$compile
- il peut prendre tout le balisage et le transformer en une fonction de liaison qui, lorsqu'elle est exécutée sur une certaine portée, transformera un morceau de texte HTML en DOM dynamique et dynamique avec toutes les directives (ici ng-src
:) réagissant aux changements de modèle. On l'appellerait comme suit: $ compile (imgHtml) ($ scope) et obtiendrait un élément DOM avec toutes les limites d'événement DOM en conséquence. $compile
utilise $interpolate
(entre autres) pour faire son travail.$interpolate
sait traiter une chaîne avec des expressions d'interpolation imbriquées, ex /path/{{name}}.{{extension}}
. : . En d'autres termes, il peut prendre une chaîne avec des expressions d'interpolation, une portée et la transformer en texte résultant. On peut considérer le $interpolation
service comme un langage de modèle très simple basé sur des chaînes. Compte tenu de l'exemple ci-dessus, on utiliserait ce service comme: $interpolate("/path/{{name}}.{{extension}}")($scope)
pour obtenir lepath/image.jpg
chaîne en conséquence.$parse
est utilisé par $interpolate
pour évaluer des expressions individuelles ( name
, extension
) par rapport à une portée. Il peut être utilisé à la fois pour lire et définir des valeurs pour une expression donnée. Par exemple, pour évaluer l' name
expression, on ferait: $parse('name')($scope)
pour obtenir la valeur "image". Pour définir la valeur, on ferait:$parse('name').assign($scope, 'image2')
Tous ces services travaillent ensemble pour fournir une interface utilisateur en direct dans AngularJS. Mais ils opèrent à différents niveaux:
$parse
ne concerne que les expressions individuelles ( name
, extension
). C'est un service de lecture-écriture.$interpolate
est en lecture seule et concerne les chaînes contenant plusieurs expressions ( /path/{{name}}.{{extension}}
)$compile
est au cœur des machines AngularJS et peut transformer des chaînes HTML (avec des directives et des expressions d'interpolation) en DOM en direct.$interpolate
dans AnjularJS et j'ai finalement obtenu une réponse compacte et informative.
$interpolate-->
Let us say you have two variables assigned to $scope object in the controller,
$scope.a = 2;
$scope.b = 3;
var f = $interpolate("Result is : {{a*b}}");
var result = f($scope);
console.log(result); --->'Result is 6'
This means that $interpolate can take the string which has one or more angular expressions.
Now $parse:
var f1 = $parse("a*b");
var result1 = f1($scope);
console.log(result1); ----> '6'
**So $interpolate has the capability to evaluate a string with angular expressions mixed up in the string against the scope to get the result**.
Another important difference between $interpolate and $parse,$eval is:
**$interpolate has the capability to work with strings containing filters along with angular expressions.**
This feature is not accessible in $eval , $parse.
console.log($interpolate("Result is : {{a*b | currency : 'USD$'}}")($scope));
---> 'Result is USD $6.00'
$ interpolate n'a pas l'accès en écriture aux variables $ scope comme nous l'avons dans $ eval et $ parse
$ parse, $ interpolate ---> doit être injecté mais $ eval n'a pas besoin d'être injecté dans le contrôleur ou là où il est utilisé
$ parse, $ interpolate donnent la fonction qui peut être évaluée par rapport à n'importe quel contexte mais $ eval est toujours évalué par rapport à $ scope.
$ eval et $ interpolate dans les coulisses utilise uniquement $ parse.
Voici l'explication mignonne.
var img = img/{{name}}.{{extension}}
$parse - > (name,extension) = > vimal , .jpg
$interpolate -> use angular $parse and convert into string -> img/vimal.jpg
$compile -> can turn html string img/vimal.jpg into live DOM so new img tag will be added inside our DOM with all prototype that a img tag have.