Quelle est la différence entre les services $ parse, $ interpolate et $ compile?

180

Quelle est la différence entre $parse, $interpolateet les $compileservices? Pour moi, ils font tous la même chose: prendre un template et le compiler en template-function.

Stépan Souvorov
la source

Réponses:

464

Ce sont tous des exemples de services qui facilitent le rendu des vues AngularJS (bien que $parseet $interpolatepuissent ê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. $compileutilise $interpolate(entre autres) pour faire son travail.
  • $interpolatesait 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 $interpolationservice 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.
  • $parseest utilisé par $interpolatepour é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' nameexpression, 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:

  • $parsene concerne que les expressions individuelles ( name, extension). C'est un service de lecture-écriture.
  • $interpolateest 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.
pkozlowski.opensource
la source
11
Bien expliqué. Voté! :)
AlwaysALearner
2
Agréable. Pouvez-vous donner des exemples d'utilisation et de résultats pour chacun d'eux? Ce n'est toujours pas clair à 100% pour moi et je pense que cela aiderait beaucoup. Merci!
Alejandro García Iglesias
2
Excellent en effet. Ici vous pouvez trouver quelques autres exemples d'utilisation réelle (et c'est un bon article simple sur l'accélération d'Angular également): speeding-up-angular-js-with-simple-optimisations "Par exemple, au lieu de rendre une navigation globale en utilisant ng-repeat, nous pourrions créer notre propre navigation en utilisant le fournisseur $ interpolate pour afficher notre modèle sur un objet et le convertir en nœuds DOM. "
Nadav Lebovitch
Excellente explication. J'ai cherché partout ce qui est réellement$interpolate dans AnjularJS et j'ai finalement obtenu une réponse compacte et informative.
Damith
L'exemple a été utilisé si efficacement pour expliquer les trois objets de service. Nous avons besoin de plus de ce type d'explications claires et basiques dans divers domaines de js angulaires pour le rendre plus accessible aux débutants.
Kings
3
$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.

Dhana
la source
0

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.
Gajender Singh
la source