Jakie są korzyści z funkcji szablonu dyrektywy w Angularjs?
Zgodnie z dokumentacją a template
może być funkcją, która pobiera dwa parametry, an element
i attributes
i zwraca wartość łańcuchową reprezentującą szablon. Zastępuje bieżący element zawartością HTML. Proces wymiany przenosi wszystkie atrybuty i klasy ze starego elementu do nowego.
Funkcja compile
zajmuje się przekształcaniem szablonu DOM. Zajmuje trzy parametry,element
, attributes
i transclude
funkcja. Parametr transclude
ma został zdeprecjonowany. Zwraca funkcję link
.
Wygląda na to, że funkcje a template
i a compile
są bardzo podobne i mogą osiągnąć to samo. Funkcja template
definiuje szablon, a funkcja compile
modyfikuje DOM szablonu. Można to jednak zrobić w samej funkcji template
. Nie rozumiem, po co modyfikować DOM szablonu poza funkcją template
. I odwrotnie, jeśli DOM można modyfikować w funkcji compile
, to po co nam funkcja template
?
2 answers
Funkcja kompilacji może być użyta do zmiany DOM, zanim wynikowa funkcja szablonu zostanie powiązana z zakresem.
Rozważ następujący przykład:
<div my-directive></div>
Możesz użyć funkcji kompilacji, aby zmienić DOM szablonu w następujący sposób:
app.directive('myDirective', function(){
return {
// Compile function acts on template DOM
// This happens before it is bound to the scope, so that is why no scope
// is injected
compile: function(tElem, tAttrs){
// This will change the markup before it is passed to the link function
// and the "another-directive" directive will also be processed by Angular
tElem.append('<div another-directive></div>');
// Link function acts on instance, not on template and is passed the scope
// to generate a dynamic view
return function(scope, iElem, iAttrs){
// When trying to add the same markup here, Angular will no longer
// process the "another-directive" directive since the compilation is
// already done and we're merely linking with the scope here
iElem.append('<div another-directive></div>');
}
}
}
});
Możesz więc użyć funkcji compile
, Aby zmienić szablon DOM na dowolny, jeśli wymaga tego twoja dyrektywa.
W większości przypadków tElem
i iElem
będą tym samym elementem DOM, ale czasami może być inaczej, jeśli dyrektywa klonuje szablon w celu wytłoczenia wielu kopii (por. ngRepeat
).
Za kulisami, Angular używa dwukierunkowego procesu renderowania (compile + link) do stemplowania kopii skompilowanego fragmentu DOM, aby zapobiec konieczności przetwarzania (= parsowania dyrektyw) tego samego DOM w kółko dla każdej instancji w przypadku, gdy dyrektywa stempluje wiele klonów, co skutkuje znacznie lepszą wydajnością.
Mam nadzieję, że to pomoże!
DODANY PO Komentarz:
Różnica między funkcją template
i compile
:
Funkcja szablonu
{
template: function(tElem, tAttrs){
// Generate string content that will be used by the template
// function to replace the innerHTML with or replace the
// complete markup with in case of 'replace:true'
return 'string to use as template';
}
}
Funkcja kompilacji
{
compile: function(tElem, tAttrs){
// Manipulate DOM of the element yourself
// and return linking function
return linkFn(){};
}
}
Funkcja szablonu jest wywoływana przed wywołaniem funkcji kompilacji.
Chociaż mogą wykonywać prawie identyczne rzeczy i dzielić ten sam 'podpis', kluczową różnicą jest to, że wartość zwracana funkcji szablonu zastąpi treść dyrektywy (lub kompletny znacznik dyrektywy if replace: true
), podczas gdy kompilator oczekuje się, że funkcja zmieni programowo DOM i zwróci funkcję link (lub obiekt z funkcją pre i post link).
W tym sensie możesz myśleć o funkcji szablonu jako o funkcji wygodnej, ponieważ nie musisz używać funkcji kompilacji, jeśli po prostu musisz zastąpić zawartość wartością łańcuchową.
Mam nadzieję, że to pomoże!
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-13 23:20:06
Jednym z najlepszych zastosowań funkcji szablonu jest warunkowe generowanie szablonu. Pozwala to zautomatyzować tworzenie szablonu na podstawie atrybutu.
Widziałem kilka bardzo dużych szablonów, które używają ng-if
do ukrywania sekcji szablonu. Ale zamiast tego wrzuca wszystko do szablonu i używając ng-if
, co może spowodować nadmierne Wiązanie, można usunąć sekcje DOM z szablonu, które nigdy nie zostaną użyte.
Powiedzmy, że masz dyrektywę, która będzie zawierać podprefekturę item-first
lub item-second
. I subdelegacja nigdy się nie zmieni w życiu dyrektywy zewnętrznej. Możesz dostosować szablon przed wywołaniem funkcji kompilacji.
<my-item data-type="first"></my-item>
<my-item data-type="second"></my-item>
I ciąg szablonów dla nich to:
<div>
<item-first></item-first>
</div>
I
<div>
<item-second></item-second>
</div>
Zgadzam się, że jest to skrajne uproszczenie, ale mam kilka bardzo skomplikowanych dyrektyw i dyrektywa zewnętrzna musi wyświetlać jedną z około 20 różnych dyrektyw wewnętrznych opartych na Typ. Zamiast używać transclude, mogę ustawić typ na zewnętrznej dyrektywie i sprawić, że funkcja szablonu wygeneruje poprawny szablon z poprawną wewnętrzną dyrektywą.
Ten poprawnie sformatowany łańcuch szablonów jest następnie przekazywany do funkcji kompilacji, itd.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-14 09:53:00