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?

Author: Maksym Bykovskyy, 2014-01-06

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!

 49
Author: jvandemo,
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.

 6
Author: Intervalia,
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