Cóż za świetne pytanie! Ja uwielbiam słuchać, co inni mają do powiedzenia, ale tutaj są wytyczne używam.
Przesłanka: zakres wysokościowy jest używana jako „klej”, którego używamy do komunikacji między kontrolerem nadrzędnym, dyrektywą i szablonem dyrektywy.
Zakres nadrzędny: scope: false
więc w ogóle nie ma nowego zakresu
Nie używam tego zbyt często, ale jak powiedział @MarkRajcok, jeśli dyrektywa nie ma dostępu do żadnych zmiennych zakresu (i oczywiście nie ustawia żadnych!), To jest to dla mnie w porządku. Jest to również pomocne w przypadku dyrektyw podrzędnych, które są używane tylko w kontekście dyrektywy nadrzędnej (choć zawsze są wyjątki od tej zasady) i które nie mają szablonu. Zasadniczo cokolwiek z szablonem nie należy do dzielenia zakresu, ponieważ z natury ujawniasz ten zakres dostępu i manipulacji (ale jestem pewien, że istnieją wyjątki od tej reguły).
Jako przykład niedawno stworzyłem dyrektywę, która rysuje (statyczną) grafikę wektorową przy użyciu biblioteki SVG, którą właśnie piszę. Jest $observe
to dwa atrybuty ( width
i height
) i wykorzystuje je w swoich obliczeniach, ale nie ustawia ani nie odczytuje żadnych zmiennych zakresu i nie ma szablonu. Jest to dobry przypadek użycia, aby nie tworzyć innego zakresu; nie potrzebujemy jednego, więc po co zawracać sobie głowę?
Jednak w innej dyrektywie SVG wymagałem zestawu danych do użycia i dodatkowo musiałem przechowywać odrobinę stanu. W takim przypadku użycie zakresu nadrzędnego byłoby nieodpowiedzialne (ponownie, ogólnie rzecz biorąc). Więc zamiast...
Zakres dziecka: scope: true
Dyrektywy z zakresem potomnym są kontekstowe i mają na celu interakcję z bieżącym zakresem.
Oczywiście kluczową zaletą tego w stosunku do zakresu izolowanego jest to, że użytkownik może swobodnie korzystać z interpolacji dowolnych atrybutów; np. użycie class="item-type-{{item.type}}"
dyrektywy z zasięgiem izolowanym nie będzie domyślnie działać, ale działa dobrze na jednym z zasięgiem potomnym, ponieważ wszystko, co jest interpolowane, nadal domyślnie znajduje się w zakresie nadrzędnym. Również sama dyrektywa może bezpiecznie oceniać atrybuty i wyrażenia w kontekście własnego zakresu, nie martwiąc się o zanieczyszczenie lub uszkodzenie rodzica.
Na przykład podpowiedź to coś, co dopiero się dodaje; zakres izolowany nie działałby (domyślnie, patrz poniżej), ponieważ oczekuje się, że użyjemy tutaj innych dyrektyw lub interpolowanych atrybutów. Etykietka to tylko ulepszenie. Jednak podpowiedź musi również określać pewne elementy zakresu, aby używać go z pod-dyrektywą i / lub szablonem, i oczywiście zarządzać własnym stanem, więc byłoby naprawdę źle używać zakresu nadrzędnego. Zanieczyszczamy to lub uszkadzamy, i nie bueno.
Często używam lunet dziecięcych niż lunet izolacyjnych lub nadrzędnych.
Wyizoluj zakres: scope: {}
Dotyczy to komponentów wielokrotnego użytku. :-)
Ale poważnie myślę o „komponentach wielokrotnego użytku” jak o „komponentach samowystarczalnych”. Chodzi o to, aby miały być używane do określonego celu, więc łączenie ich z innymi dyrektywami lub dodawanie innych interpolowanych atrybutów do węzła DOM z natury nie ma sensu.
Mówiąc ściślej, wszystko, co jest potrzebne do tej samodzielnej funkcjonalności, jest dostarczane poprzez określone atrybuty oceniane w kontekście zakresu nadrzędnego; są to albo ciągi jednokierunkowe („@”), wyrażenia jednokierunkowe („&”), albo dwukierunkowe powiązania zmiennych („=”).
W przypadku komponentów niezależnych nie ma sensu stosowanie innych dyrektyw lub atrybutów, ponieważ istnieje ona sama. Jego stylem rządzi własny szablon (w razie potrzeby) i można przenieść odpowiednią treść (w razie potrzeby). Jest samodzielny, więc umieściliśmy go w izolowanym zakresie, aby powiedzieć: „Nie zadzieraj z tym. Daję ci zdefiniowane API poprzez te kilka atrybutów”.
Dobrą najlepszą praktyką jest wykluczenie jak największej liczby elementów opartych na szablonie z funkcji łącza dyrektywy i kontrolera, jak to możliwe. Zapewnia to kolejny punkt konfiguracji „podobny do API”: użytkownik dyrektywy może po prostu zastąpić szablon! Funkcjonalność pozostała taka sama, a jej wewnętrzny interfejs API nigdy nie został zmieniony, ale możemy popsuć stylem i implementacją DOM tyle, ile potrzebujemy. Interfejs użytkownika / bootstrap jest doskonałym przykładem tego, jak to zrobić dobrze, ponieważ Peter i Paweł są niesamowici.
Lunety z izolatami świetnie nadają się również do stosowania z transkluzją. Weź karty; stanowią one nie tylko całą funkcjonalność, ale wszystko, co jest w środku , można swobodnie oceniać z zakresu nadrzędnego, pozostawiając zakładki (i panele), aby zrobić, co chcą. Karty mają oczywiście swój własny stan , który należy do zakresu (do interakcji z szablonem), ale ten stan nie ma nic wspólnego z kontekstem, w którym został użyty - jest całkowicie wewnętrzny z tego, co czyni dyrektywę tabu dyrektywą tab. Ponadto nie ma sensu używać żadnych innych dyrektyw z kartami. To są zakładki - a my już mamy tę funkcjonalność!
Otocz go większą funkcjonalnością lub włącz więcej funkcjonalności, ale dyrektywa jest już taka, jak jest.
To powiedziawszy, należy zauważyć, że istnieją pewne sposoby obejścia niektórych ograniczeń (tj. Cech) izolowanego zakresu, jak wskazał @ProLoser w swojej odpowiedzi. Na przykład w sekcji zakresu potomnego wspomniałem o interpolacji w przypadku łamania atrybutów niebędących dyrektywami podczas korzystania z zakresu izolowanego (domyślnie). Ale użytkownik może na przykład po prostu użyć class="item-type-{{$parent.item.type}}"
i to po raz kolejny zadziała. Jeśli więc istnieje ważny powód, aby używać lunety izolacyjnej nad lunetą potomną, ale martwisz się niektórymi z tych ograniczeń, wiedz, że możesz obejść je wszystkie, jeśli zajdzie taka potrzeba.
Podsumowanie
Dyrektywy bez nowego zakresu są tylko do odczytu; są całkowicie zaufani (tj. wewnętrzni dla aplikacji) i nie dotykają wtyczki jack. Dyrektywy z zakresem potomnym dodają funkcjonalność, ale nie są jedyną funkcjonalnością. Wreszcie, izolowane zakresy dotyczą dyrektyw, które są całym celem; są samodzielne, więc jest w porządku (i większość „poprawnych”), aby pozwolić im przejść na nieuczciwość.
Chciałem poznać moje początkowe przemyślenia, ale kiedy wymyślę więcej rzeczy, zaktualizuję to. Ale cholera - to długo czeka na SO odpowiedź ...
PS: Całkowicie styczna, ale skoro mówimy o zakresach, wolę powiedzieć „prototypowy”, podczas gdy inni wolą „prototypowy”, który wydaje się być bardziej dokładny, ale po prostu nie zsuwa się z języka. :-)