Podczas tworzenia dyrektywy można wstawić kod do kompilatora, funkcji łącza lub kontrolera.
W dokumentach wyjaśniają, że:
- funkcje kompilacji i łączenia są używane w różnych fazach cyklu kątowego
- kontrolery są współużytkowane między dyrektywami
Jednak dla mnie nie jest jasne, jaki kod powinien iść gdzie.
Np .: Czy mogę tworzyć funkcje w kompilacji i mieć je dołączone do zakresu w łączu, czy tylko dołączać funkcje do zakresu w kontrolerze?
W jaki sposób kontrolery są dzielone między dyrektywy, jeśli każda dyrektywa może mieć swój własny kontroler? Czy kontrolery są naprawdę współużytkowane, czy to tylko właściwości zakresu?
angularjs
angularjs-directive
schacki
źródło
źródło
Odpowiedzi:
Kompiluj:
Na tym etapie Angular kompiluje twoją dyrektywę. Ta funkcja kompilacji jest wywoływana tylko raz dla każdego odwołania do danej dyrektywy. Załóżmy na przykład, że używasz dyrektywy ng-repeat. ng-repeat będzie musiał wyszukać element, do którego jest dołączony, wyodrębnić fragment HTML, do którego jest dołączony, i utworzyć funkcję szablonu.
Jeśli użyłeś HandleBars, szablonów podkreślenia lub równoważnych, to tak jak kompilowanie ich szablonów w celu wyodrębnienia funkcji szablonu. Do tej funkcji szablonu przekazujesz dane, a zwracaną wartością tej funkcji jest html z danymi we właściwych miejscach.
Faza kompilacji to etap w Angular, który zwraca funkcję szablonu. Ta funkcja szablonu w układzie kątowym nazywa się funkcją łączenia.
Faza łączenia:
Faza łączenia to miejsce, w którym dołączasz dane ($ scope) do funkcji łączenia i powinna ona zwrócić ci połączony HTML. Ponieważ dyrektywa określa również, gdzie idzie ten HTML lub co się zmienia, warto już iść. Jest to funkcja, w której chcesz wprowadzić zmiany w połączonym html, tj. Html, który już ma dołączone dane. W angular, jeśli piszesz kod w funkcji łączenia, jest to zazwyczaj funkcja post-link (domyślnie). Jest to rodzaj wywołania zwrotnego, które jest wywoływane po powiązaniu danych z szablonem przez funkcję łączenia.
Kontroler :
Kontroler to miejsce, w którym wprowadzasz logikę specyficzną dla dyrektywy. Ta logika może również przejść do funkcji łączenia, ale wtedy musiałbyś umieścić tę logikę w zakresie, aby uczynić ją „współdzieloną”. Problem polega na tym, że powodowałbyś wówczas uszkodzenie zakresu za pomocą dyrektyw, co nie jest tak naprawdę oczekiwanym. Więc jaka jest alternatywa, jeśli dwie dyrektywy chcą ze sobą rozmawiać / współpracować ze sobą? Oczywiście można umieścić całą tę logikę w usłudze, a następnie uzależnić obie te dyrektywy od tej usługi, ale to po prostu wprowadza jeszcze jedną zależność. Alternatywą jest zapewnienie kontrolera dla tego zakresu (zwykle izolować zakres?), A następnie kontroler ten jest wprowadzany do innej dyrektywy, gdy ta dyrektywa „wymaga” drugiej.
źródło
controller
funkcji dyrektywy jest wykonywana po kompilacji, ale wcześniejpre-link
w lokalnej gałęzi drzewa DOM. Równieżcontroller
ipre-link
funkcje są wykonywane przez lokalny oddział DOM w odgórny sposób. Następniepost-link
jest wykonywany w sposób oddolny .controller
zamiastlink
wszędzie? Aby nie musiałem zmieniać kodu w przyszłości, jeśli trzeba udostępnić metodę lub wprowadzić logikę ?. Czy są jakieś pułapki w używaniu przezcontroller
cały czas zamiast linku?Chciałem również dodać, co ma do powiedzenia książka O'Reily AngularJS zespołu Google:
źródło
A
directive
pozwala na poszerzenie słownictwa HTML w deklaratywny sposób do budowania komponentów internetowych.ng-app
Atrybut jest dyrektywa, tak jestng-controller
i wszyscyng- prefixed attributes
. Dyrektywy mogą byćattributes
,tags
lub nawetclass
names
,comments
.Jak powstają dyrektywy (
compilation
iinstantiation
)Kompilacja: użyjemy tej
compile
funkcji zarównomanipulate
dla DOM, zanim zostanie on zrenderowany, jak i zwrócimylink
funkcję (która obsłuży dla nas linkowanie). Jest to również miejsce do umieszczenia wszelkich metod, które muszą być udostępnione wszystkiminstances
z tej dyrektywy.link: użyjemy tej
link
funkcji do zarejestrowania wszystkich detektorów w określonym elemencie DOM (sklonowanym z szablonu) i skonfigurowania naszych powiązań ze stroną.Jeśli ustawione w
obiekcie.
compile()
funkcji, byłyby ustawione tylko raz (co często jest tym, czego chcesz). Jeśli ustawione wlink()
funkcji, byłyby ustawione za każdym razem, gdy element HTML jest powiązany z danymi wCompile
funkcja zwraca funkcjępre
ipost
link. W funkcji wstępnego linku mamy szablon instancji, a także zakres zcontroller
, ale szablon nie jest powiązany z zakresem i nadal nie zawiera treści zawartej w transkluzji.Post
funkcja link to miejsce, w którym link do strony to ostatnia funkcja do wykonania. Teraztransclusion
jest gotowe,the template is linked to a scope
, iview will update with data bound values after the next digest cycle
. Talink
opcja jest tylko skrótem do konfiguracjipost-link
funkcji.kontroler: dyrektywy można przekazać do innej fazy łączenia / kompilacji dyrektywy. Może być wprowadzony do innych dyrektyw jako środek do wykorzystania w komunikacji między dyrektywami.
Musisz podać nazwę wymaganej dyrektywy - powinna ona być powiązana z tym samym elementem lub jego rodzicem. Nazwę można poprzedzić:
Użyj nawiasu kwadratowego,
[‘directive1′, ‘directive2′, ‘directive3′]
aby wymagać kontrolera wielu dyrektyw.źródło
Ponadto dobrym powodem do użycia funkcji kontroler vs. link (ponieważ oba mają dostęp do zakresu, elementu i atrybutów) jest to, że można przekazać dowolną dostępną usługę lub zależność do kontrolera (i w dowolnej kolejności), podczas gdy nie można tego zrobić za pomocą funkcji link. Zwróć uwagę na różne podpisy:
vs.
źródło
module.directive('myDirective', function($window) { etc...
. : . Następnie można uzyskać do niego dostęp z poziomu funkcji łącza.jest to dobra próbka do zrozumienia faz dyrektywy http://codepen.io/anon/pen/oXMdBQ?editors=101
HTML
źródło
link
,compile
acontroller
?require
można wprowadzić dyrektywę d do kontrolera zależnej dyrektywy?źródło