Cos'è una direttiva AngularJS?


181

Ho trascorso parecchio tempo a leggere la documentazione di AngularJS e diversi tutorial, e sono rimasto piuttosto sorpreso da quanto sia inaccessibile la documentazione.

Ho una domanda semplice, che può essere utile anche per gli altri che desiderano raccogliere AngularJS:

Cos'è una direttiva AngularJS?

Dovrebbe esserci una definizione semplice e precisa di una direttiva da qualche parte, ma il sito Web AngularJS offre queste definizioni sorprendentemente inutili:

Nella home page :

Le direttive sono una funzione unica e potente disponibile in AngularJS. Le direttive ti consentono di inventare una nuova sintassi HTML, specifica per la tua applicazione.

Nella documentazione per gli sviluppatori :

Le direttive sono un modo per insegnare nuovi trucchi HTML. Durante la compilazione del DOM le direttive vengono confrontate con l'HTML ed eseguite. Ciò consente alle direttive di registrare il comportamento o di trasformare il DOM.

E c'è una serie di discorsi sulle direttive che, ironicamente, sembrano presumere che il pubblico capisca già cosa sono.

Qualcuno sarebbe in grado di offrire, per un chiaro riferimento, una definizione precisa di ciò che una direttiva spiega:

  1. Che cos'è (vedi la chiara definizione di jQuery come esempio)
  2. Quali problemi pratici e situazioni si intende affrontare
  3. Quale modello di progettazione incarna o, in alternativa, come si adatta alla presunta missione MVC / MVW di AngularJS.

2
Mi avevi in ​​... vedi la chiara definizione di jQuery come esempio.
joshuamabina,

Non sono sicuro di come sia stato nel 2012 su Stack Overflow, ma ho appena rivisto questa domanda e aggiunto il tag "direttiva angolare". Le informazioni sui tag in realtà danno una definizione abbastanza chiara. Inoltre, ho notato che non riesco a trovare la seconda citazione nei documenti per sviluppatori ...
user4642212

Risposte:


142

Che cos'è (vedi la chiara definizione di jQuery come esempio)?

Una direttiva è essenzialmente una funzione che viene eseguita quando il compilatore angolare la trova nel DOM. Le funzioni possono fare praticamente qualsiasi cosa, motivo per cui penso che sia piuttosto difficile definire cosa sia una direttiva. Ogni direttiva ha un nome (come ng-repeat, tabs, make-up-your-own) e ogni direttiva determina dove può essere usata: elemento, attributo, classe, in un commento.

Una direttiva normalmente ha solo una funzione (post) link. Una direttiva complicata potrebbe avere una funzione di compilazione, una funzione pre-link e una funzione post-link.

Quali problemi pratici e situazioni si intende affrontare?

La cosa più potente che le direttive possono fare è estendere l'HTML. Le tue estensioni sono un linguaggio specifico di dominio (DSL) per la creazione della tua applicazione. Ad esempio, se la tua applicazione gestisce un sito di shopping online, puoi estendere HTML per avere direttive "carrello", "coupon", "speciali", ecc. - qualsiasi parola, oggetto o concetto sia più naturale da usare all'interno del " "dominio" dello shopping online, anziché "div" e "span" (come già menzionato @WTK).

Le direttive possono anche strutturare HTML - raggruppare un gruppo di HTML in alcuni componenti riutilizzabili. Se ti ritrovi a utilizzare ng-include per estrarre un sacco di codice HTML, è probabilmente il momento di rifattorizzare le direttive.

Quale modello di progettazione incarna o, in alternativa, come si adatta alla presunta missione MVC / MVW di angularjs

Le direttive sono dove manipoli il DOM e catturi gli eventi DOM. Questo è il motivo per cui le funzioni di compilazione e collegamento della direttiva ricevono entrambe "l'elemento" come argomento. Puoi

  • definire un gruppo di HTML (ovvero un modello) per sostituire la direttiva
  • associare eventi a questo elemento (o ai suoi figli)
  • aggiungi / rimuovi una classe
  • cambia il valore del testo ()
  • guardare le modifiche agli attributi definiti nello stesso elemento (in realtà sono i valori degli attributi che vengono controllati - queste sono proprietà dell'ambito, quindi la direttiva controlla il "modello" per le modifiche)
  • eccetera.


In HTML abbiamo cose come <a href="...">, <img src="...">, <br>, <table><tr><th>. Come descriveresti cosa sono a, href, img, src, br, table, tr e th? Ecco cos'è una direttiva.


2
Mark, grazie. Penso che questo sia chiaro e probabilmente il più vicino a una risposta accurata. Penso che le direttive siano sempre legate ai tag html, giusto? Quindi forse è più preciso affermare che una direttiva è una funzione legata a un tag HTML. Pertanto, consente di estendere in modo dichiarativo il linguaggio HTML.
tohster

Bene, una direttiva può essere utilizzata in un commento, quindi non tutte le direttive devono essere associate a un tag HTML. Ad esempio,<!-- directive: my-directive exp -->
Mark Rajcok,

Mark, sarebbe un uso non convenzionale di una direttiva? vale a dire che le direttive sono convenzionalmente utilizzate e proposte per estendere l'HTML.
tohster

9
OK ho una migliore comprensione ora. Un modo di pensarci è: 1. I DSL di solito rappresentano alberi di sintassi 2. Il DOM HTML è un albero di sintassi DSL ma è rigido: i tag sono per lo più progettati e propositi in modo rigido e non estensibili. 3. AngularJS e il meccanismo direttiva in particolare, rendono il DOM HTML più flessibile consentendo agli sviluppatori di creare nodi ad albero personalizzati. Questi nodi possono rappresentare nuovi comportamenti o aggregazioni di comportamenti esistenti (sotto-alberi) 4. Pertanto, le direttive consentono all'HTML DOM di evolversi in un DSL personalizzato
tohster

1
@MarkRajcok Sto lottando con il tuo ultimo paragrafo. È semplice <div></div>è una direttiva? Hai detto di sì. Ma qui non c'è decorazione (tramite elemento, classe, commento, attributo). Le persone qui stanno dicendo che si tratta di re-markers per un DOM HTML . Puoi chiarire? (Non sto parlando della causa in cui è possibile creare una direttiva per un elemento semplice come <div>)
Royi Namir,

11

Forse sarebbe una definizione davvero semplice e iniziale per le direttive angolari

Le direttive AngularJS (ng-direttive) sono attributi HTML con un prefisso ng (ng-model, ng-app, ng-repeat, ng-bind) usato da Angular per estendere HTML. ( da: tutorial angolare di W3schools )

Alcuni esempi di questo sarebbero

La direttiva ng-app definisce un'applicazione AngularJS.

La direttiva ng-model lega il valore dei controlli HTML (input, select, textarea) ai dati dell'applicazione.

La direttiva ng-bind lega i dati dell'applicazione alla vista HTML.

<div ng-app="">
    <p>Name: <input type="text" ng-model="name"></p>
    <p ng-bind="name"></p>
</div>

Dai un'occhiata a questo tutorial, almeno per me è stata una delle migliori presentazioni di Angular. Un approccio più completo sarebbe tutto ciò che @ mark-rajcok ha detto prima.


4

Guardando la documentazione, le direttive sono strutture che è possibile scrivere che angularjs analizza per creare oggetti e comportamenti, in altre parole è un modello in cui si utilizza una combinazione di nodi arbitrari e pseudo-javascript e segnaposto per i dati per esprimere le intenzioni di come il widget (componente) è strutturato, come si comporta e come viene alimentato con i dati. Angularjs quindi corre contro quelle direttive per tradurle in codice html / javascript funzionante.

Le direttive sono lì per consentirti di costruire componenti (widget) più complessi usando la semantica corretta. Dai un'occhiata all'esempio di direttive angularjs: stanno definendo il riquadro delle schede (che ovviamente non è valido nel normale HTML). È più intuitivo rispetto all'utilizzo di div-s o span per creare una struttura che viene quindi definita come un riquadro a schede.


Ho aggiunto che ciò che ritengo sia una spiegazione leggermente meno tecnica.
raam86,

1
Grazie è molto utile. Quindi forse posso pensarlo come una sorta di modello dinamico (simile a una classe di programmazione OO) che incapsula un componente, lo descrive per proprietà e comportamenti, è in grado di essere istanziato e può esprimersi al DOM? E il motivo per cui esiste (rispetto all'oggetto javascript o al modello html) è quello di consentire ai tag HTML di assumere comportamenti più dinamici, simili ad oggetti, in modo che possano iniziare a diventare manipolabili nella programmazione di tipo OO?
tohster il

Sì e no. Non direi che la ragione per cui esistono le direttive ha molto a che fare con la manipolazione della programmazione OO. In realtà l'intero approccio angularjs al framework sembra fortemente correlato agli attributi HTML e nodi DOM arbitrari piuttosto che alla scrittura del codice Javascript OO. Ho quell'atmosfera guardando tutti gli esempi di come angularjs sta risolvendo i problemi quotidiani. Direi che la ragione principale dietro le direttive è quella di avere modo di incorporare comportamenti e dati in un componente semanticamente strutturato.
WTK,

3

In AngularJS le direttive sono markers html per un elemento DOM HTML come un attributo (restringimento-A), nome elemento (restringimento-E), commento (restringimento-M) o classe CSS (restringimento -C) che dicono al compilatore HTML di AngularJS ($ compilare) per eseguire un comportamento specificato a quell'elemento DOM o persino trasformare l'elemento DOM e i suoi figli. Alcuni esempi sono ng-bind, ng-hide / show ecc.


2

La homepage è molto chiara al riguardo: quando passi il mouse sulle schede nell'ultima sezione:

Abbiamo esteso il vocabolario di HTML con un tabs elemento personalizzato . La tabsastrae la struttura HTML complessa e comportamenti necessari per il rendering di schede. Il risultato è una vista più leggibile e una sintassi riutilizzabile molto facilmente. "

Quindi nella scheda successiva:

angular.module('components', []).
  directive('tabs', function() {
    return {
      restrict: 'E',
      transclude: true,
      scope: {},
      controller: function($scope, $element) {
        var panes = $scope.panes = [];

        $scope.select = function(pane) {
          angular.forEach(panes, function(pane) {
            pane.selected = false;
          });
          pane.selected = true;
        }

Quindi puoi inventare elementi html, ovvero tabslasciare che angular gestisca il rendering di quegli elementi.


2
Grazie per la risposta rapida! Quindi lo scopo di una direttiva è quello di estendere il vocabolario HTML con la creazione di tag e attributi personalizzati? Sembra abbastanza potente, sebbene sembri affrontare una portata del problema molto più ampia di "MVW". A proposito, altri potrebbero non essere d'accordo, ma penso che scorrere fino alla fine di una pagina, quindi passare con il mouse su una parola con collegamento ipertestuale e quindi leggere una descrizione comandi che non menziona una volta la parola "direttiva" non è esattamente un " definizione molto chiara di cosa sia una direttiva. Tuttavia, apprezzo molto la risposta rapida.
tohster

Sì! Puoi controllare questo violino che hanno creato. L'attuale html è diverso da on nel riquadro html.
raam86,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.