Quels sont les avantages d'une directive fonction de modèle dans Angularjs?
Conformément à la documentation d'un template
peut être une fonction qui prend deux paramètres, un element
et attributes
et retourne une chaîne de caractères représentant le modèle. Il remplace l'élément en cours avec le contenu de l'HTML. Le processus de remplacement migre tous les attributs et les classes de l'ancien élément de la nouvelle.
La compile
fonction traite de transformer le modèle DOM. Elle prend trois paramètres, un element
, attributes
et transclude
fonction. Le transclude
paramètre a été désapprouvée. Elle renvoie une link
fonction.
Il apparaît qu'un template
et un compile
fonctions sont très similaires et peuvent atteindre la même chose. Le template
fonction définit un modèle et compile
fonction modifie le modèle DOM. Cependant, il peut être fait dans le template
fonction elle-même. Je ne vois pas pourquoi modifier le modèle DOM à l'extérieur de la template
fonction. Et vice-versa, si le DOM peut être modifié dans le compile
fonction de ce qui est le besoin pour un template
fonction?
- Si vous retourne la chaîne qui est la personne à charge sur les attributs à partir d'un modèle de fonction, utiliser moins de code que dans le compiler depuis de ne pas avoir à injecter
$compile
et l'utiliser. Angulaire va le faire à l'interne au lieu - Je n'ai pas vraiment suivi. Pourriez-vous donner un exemple s'il vous plaît? Parlez-vous de retourner une chaîne de modèle qui utilise les valeurs de
attrs
? Comme"<div size=\"" + attrs.size + "\"></div>"
. - oui .. comme par votre exemple. Mais pourrait également contenir des conditions aussi...
if(attrs.type=='somVal') {return string1;}else{ return string2}
- Ok, je vois, semblable à la <input type="text|bouton|case|..."> où l'attribut n'a pas besoin d'être compilé.
- Où l'attribut n'a pas besoin d'être interpolées je dois dire vraiment.
Vous devez vous connecter pour publier un commentaire.
La compilation de la fonction peut être utilisée pour modifier le DOM avant que les modèle de fonction est liée à la portée.
Considérons l'exemple suivant:
Vous pouvez utiliser la compilation de la fonction pour changer le modèle DOM comme ceci:
De sorte que vous pouvez utiliser le
compile
fonction pour changer le modèle DOM pour tout ce que vous voulez si votre directive exige.Dans la plupart des cas
tElem
etiElem
sera le même élément du DOM, mais parfois il peut être différent si une directive clones le modèle de timbre des copies multiples (cf.ngRepeat
).Derrière les coulisses, Angulaire utilise un 2-way processus de rendu (compilation + lien) afin de timbre des copies de la compilation d'un morceau de DOM, pour éviter Angulaire de processus (= analyse des directives) de la même DOM maintes et maintes fois pour chaque instance dans le cas où la directive timbres plusieurs clones résultant dans de bien meilleures performances.
Espère que ça aide!
AJOUTÉ APRÈS LE COMMENTAIRE:
La différence entre un
template
etcompile
fonction:Fonction de modèle
De la compilation de la fonction
Le modèle de la fonction est appelée avant la compilation de la fonction est appelée.
Bien qu'ils puissent effectuer presque identique trucs et partagent la même "signature", la principale différence est que la valeur de retour de la fonction de modèle va remplacer le contenu de la directive ou de la directive de balisage si
replace: true
), tandis que la compilation de la fonction est prévu de modifier le DOM par programme et le retour d'une fonction link (ou de l'objet avec pré et post le lien de fonction).En ce sens que vous pouvez penser de la fonction de modèle, comme une sorte de fonction de commodité pour ne pas avoir à utiliser la compilation en fonction de si vous avez simplement besoin de remplacer le contenu d'une chaîne de valeur.
Espère que ça aide!
template: function(element, attrs) { return "<div></div>"; }
la fonction par rapport à la compilation de la fonction.L'une des meilleures utilisations de la fonction de modèle est conditionnelle, de générer un modèle. Cela vous permet d'automatiser la création d'un modèle basé sur un attribut ou toute autre condition.
J'en ai vu de très grands modèles qui utilisent
ng-if
pour masquer les sections du modèle. Mais au lieu de placer le tout dans le modèle et en utilisantng-if
, ce qui peut causer un excès de liaison, vous pouvez supprimer des sections de DOM à partir de la sortie de la fonction de modèle qui ne sera jamais utilisé.Disons que vous avez une directive d'inclure des sous-directive
item-first
ouitem-second
. Et le sous-directive ne changera jamais pour la vie de l'extérieur de la directive. Vous pouvez régler la sortie du modèle, avant la compilation de la fonction appelée.Et le modèle de la chaîne de:
et
Je suis d'accord que c'est une simplification extrême, Mais j'ai quelques très compliqué directives et à l'extérieur de la directive doit afficher une de, environ, 20 différents interne des directives basées sur un type. Au lieu d'utiliser transclude, je peux définir le type sur la face extérieure de la directive et ont la fonction de modèle génère le bon modèle avec le corriger intérieure de la directive.
Que correctement formaté modèle de chaîne est ensuite transmis à la compilation de la fonction, etc.
data-type
comme dans<my-item data-type="{{ $ctrl.someItem.dataType}}"></my-item>
? Ressemble fonction de modèle verrez littérale valeurs des attributs, par exemple.tAttr['data-type'] == '{{ $ctrl.someItem.dataType}}'
au lieu detAttr['data-type'] == 'first'
🙁$parse
pour obtenir la valeur de$ctrl.someItem.dataType
. Au moins, je pense que c'était$parse
(context, locals)
à partir de laquelle il sera la résolution de l'expression réelle. Et danstemplate()
fonction de la$scope/context
de la directive n'est pas visible....