Atrybuty dopasowujące określają sposób w jaki dane będą przekazywane pomiędzy dyrektywą (child), a komponentem wykorzystującym tą dyrektywę (parent).
Pierwszym rodzajem atrybutów o jakim będziemy mówić jest atrybut
dopasowujący wartość. Jego działanie polega na tym, że dane przekazywane do dyrektywy
są dostarczane pod postacią konkretnych wartości, np. tekstu. W ten sposób między komponentem parenta a dyrektywą zostaje nawiązana relacja jednokierunkowa (one-direction).
Oznacza to, że każda zmiana danej wartości po stronie kontrolera zostanie odzwierciedlona w dyrektywie, natomiast dowolna jej zmiana po stronie dyrektywy nie będzie miała
wpływu na wartość, która znajduje się w kontrolerze.
Atrybut dopasowujący '@'
Tak jak wszystkie inne atrybuty tego typu podajemy go w ramach obiektu konfiguracyjnego
scope.
Nazwa własności w obiekcie odpowiada nazwie atrybutu jakiego chcemy użyć w naszej dyrektywie:
W pliku HTML dyrektywy możemy odwołać się do wskazanej własności:
Tak zdefiniowana dyrektywa może być już wstawiona do HTML-a parenta (np. do formularza dodawania itemu, dla którego będziemy definiować listę kategorii):
W rezultacie dyrektywa pojawi się w przeglądarce w postaci HTML-a zawierającego div-a z tekstem "Informacja o itemach".
W ten sposób przekazujemy wartości tekstowe do dyrektyw.
Co jednak gdybyśmy chcieli użyć w atrybucie
sometext czegoś więcej niż tylko zwykłego stringa.
Chcielibyśmy na przykład dodać do tego tekstu wyrażenie
{{ infomessage }}, które będzie wyświetlało tekst ze zmiennej ustawianej gdzieś w kontrolerze.
Wtedy najpierw inicjujemy tą zmienną:
, a następnie dodajemy wyrażenie jako część atrybutu
sometext:
W rezultacie dyrektywa pojawi się w przeglądarce w postaci HTML-a zawierającego div-a z tekstem "Informacja o itemach - Itemy są podzielone na kategorie".
Atrybut dopasowujący '@attr'
Przykład, który opisaliśmy charakteryzuje się tym, że nazwa naszego atrybutu stosowana w trakcie wstawiania dyrektywy do HTML-a, jest dokładnie taka
sama jak nazwa określona w obiekcie konfiguracyjnym
scope. Może się jednak zdarzyć, że będziemy chcieli zdefiniować te nazwy inaczej.
W takiej sytuacji musimy określić
nową nazwę własności w obiekcie konfiguracyjnym, a następnie przenieść dotychczasową nazwę na prawo,
tak by teraz stała się
częścią zespoloną z atrybutem @.
Następnie zmieniamy również starą nazwę na nową w pliku HTML:
Dzięki tym zmianom możemy teraz używać innej nazwy w dyrektywie (
sometextparam) oraz innej nazwy (
sometext) podczas
wstawiania tej dyrektywy w pliku HTML parenta:
W rezultacie dyrektywa pojawi się w przeglądarce w postaci HTML-a zawierającego div-a z tekstem "Informacja o itemach - Itemy są podzielone na kategorie".
Nasza rekomendacja
Rozsądnym rozwiązaniem jest ograniczanie "produkcji" różnorodnych nazw dla tych samych aspektów kodu oraz utrzymywanie jego maksymalnej czytelności, dlatego też warto używać
prostszej wersji atrybutu dopasowującego wartość - w postaci '@'. Niemniej atrybut '@attr' staje się bardzo przydatny, gdy tworzymy dyrektywę generyczną, czyli taką która jest bardzo ogólna i niekoniecznie związana z kontekstem
wywołania. Wtedy w naszym kontrolerze możemy chcieć użyć nazwy, która jest charakterystyczna w ramach tego kontrolera i użycie tam ogólnej nazwy definiowanej w dyrektywie
może nam nic nie mówić w przyszłości, gdy wrócimy do tego kodu.
Używamy w StartAPPa
W aplikacji używamy dyrektywy
appa-form-categories, której zadaniem jest zbudowanie komponentu wyświetlającego listę wielokrotnego wyboru kategorii,
w ramach formularza dodającego i edytującego itemy. Formularz ten jest częścią kursu
Formularz Zaawansowany.
Zawiera on również kilka innych dyrektyw, np. dyrektywy tworzące komponenty dat lub dyrektywy budujące listy atrybutów w postaci grupy checkboxów.
Linki
https://docs.angularjs.org/api/ng/service/$compile#directive-definition-object