¿Qué es una directiva AngularJS?


He pasado bastante tiempo leyendo la documentación de AngularJS y varios tutoriales, y me ha sorprendido lo inaccesible que es la documentación.

Tengo una pregunta simple y respondible que también puede ser útil para otros que buscan recoger AngularJS:

¿Qué es una directiva AngularJS?

Debería haber una definición simple y precisa de una directiva en alguna parte, pero el sitio web AngularJS ofrece estas sorprendentemente inútiles definiciones:

En la página de inicio:

Las directivas son una característica única y potente disponible en AngularJS. Las directivas le permiten inventar una nueva sintaxis HTML, específica para su aplicación.

En la documentación para desarrolladores :

Las directivas son una forma de enseñar nuevos trucos en HTML. Durante la compilación DOM las directivas se comparan con el HTML y se ejecutan. Esto permite a las directivas registrar el comportamiento, o transformar DOM.

Y hay una serie de charlas sobre directivas que, irónicamente, parecen asumir que la audiencia ya entiende lo que son.

¿Podría alguien ofrecer, para una referencia clara, una definición precisa de lo que es una directiva que explica:

  1. Qué es (véase la definición clara de jQuery como ejemplo)
  2. Qué problemas y situaciones prácticas se pretende abordar
  3. ¿Qué patrón de diseño es encarna, o alternativamente, cómo encaja en la supuesta misión MVC / MVW de AngularJS.
Author: Xufox, 2012-12-14

5 answers

¿Qué es (ver la definición clara de jQuery como ejemplo)?

Una directiva es esencialmente una función esto se ejecuta cuando el compilador Angular lo encuentra en el DOM. La(s) función (es) puede (n) hacer casi cualquier cosa, por lo que creo que es bastante difícil definir lo que es una directiva. Cada directiva tiene un nombre (como ng-repeat, tabs, make-up-your-own) y cada directiva determina dónde se puede utilizar: element, attribute, class, in a comentario.

Una directiva normalmente solo tiene una función de enlace (post). Una directiva complicada podría tener una función de compilación, una función de enlace previo y una función de enlace posterior.

¿Qué problemas y situaciones prácticas se pretende abordar?

Lo más poderoso que pueden hacer las directivas es extender HTML. Sus extensiones son un Lenguaje Específico del Dominio (DSL) para crear su aplicación. Por ejemplo, si su aplicación ejecuta una compra en línea sitio, puede extender HTML para tener "carrito de compras"," cupón"," especiales", etc. directivas whatever cualesquiera palabras u objetos o conceptos son más naturales de usar dentro del dominio de" compras en línea", en lugar de"div "y"span" (como ya se mencionó @WTK).

Las directivas también pueden componentizar HTML group agrupar un montón de HTML en algún componente reutilizable. Si usted se encuentra usando ng-include para extraer gran cantidad de HTML, es probablemente el momento de refactorizar en directivas.

Qué diseño patrón encarna, o alternativamente, cómo encaja en la supuesta misión MVC/MVW de angularjs

Las directivas son donde usted manipula los eventos DOM y captura DOM. Esta es la razón por la que las funciones compile y link de la directiva reciben el "elemento" como argumento. Usted puede

  • definir un montón de HTML (es decir, una plantilla) para reemplazar la directiva
  • enlaza eventos a este elemento (o sus hijos)
  • añadir/eliminar una clase
  • cambiar el valor text ()
  • observe los cambios en los atributos definidos en el mismo elemento (en realidad son los valores de los atributos los que se observan these estas son propiedades de ámbito, por lo tanto, la directiva observa el "modelo" para los cambios)
  • etc.


En HTML tenemos cosas como <a href="...">, <img src="...">, <br>, <table><tr><th>. ¿Cómo describiría lo que son a, href, img, src, br, table, tr y th? Eso es una directiva.
 135
Author: Mark Rajcok,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-16 04:04:33

Tal vez una definición realmente simple e inicial para directivas angulares sería

Las directivas AngularJS (ng-directives) son atributos HTML con un prefijo ng (ng-model, ng-app, ng-repeat, ng-bind) usado por Angular para extender HTML. ( de: W3schools angular tutorial )

Algunos ejemplos de esto serían

La directiva ng-app define una aplicación AngularJS.

La directiva ng-model vincula la valor de los controles HTML (entrada, select, textarea) a los datos de la aplicación.

La directiva ng-bind vincula los datos de la aplicación a la vista HTML.

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

Revisa este tutorial , al menos para mí fue una de las mejores introducciones a Angular. Un enfoque más completo sería todo lo que @mark-rajcok dijo antes.

 10
Author: jplozgom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-10 07:16:44

Mirando la documentación, las directivas son estructuras que puedes escribir que angularjs analiza para crear objetos y behaviors.In en otras palabras, es una plantilla en la que se utiliza una mezcla de nodos arbitrarios y pseudo-javascript y marcadores de posición para los datos para expresar las intenciones de cómo su widget (componente) está estructurado, cómo se comporta y cómo se alimenta con datos. Angularjs luego se ejecuta contra esas directivas para traducirlas a html/javascript de trabajo codificar.

Las directivas están ahí para que pueda construir componentes más complejos (widgets) utilizando la semántica adecuada. Basta con echar un vistazo al ejemplo de directivas angularjs - están definiendo el panel de pestañas (que por supuesto no es válido en HTML normal). Es más intuitivo que usar div-s o spans para crear una estructura que luego se estiliza a como un panel de pestañas.

 4
Author: WTK,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-14 09:15:44

En las directivas AngularJS hay marcadores re html para un elemento DOM HTML como un atributo(restrict - A), nombre de elemento(restrict - E), comentario(restrict - M) o clase CSS(restrict - C) que le dicen al compilador HTML de AngularJS (compile compile) que realice un comportamiento especificado a ese elemento DOM o incluso transforme el elemento DOM y sus hijos.Algunos ejemplos son ng-bind ,ng-hide/show, etc.

 3
Author: Vivek Panday,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-14 06:48:33

La página de inicio es muy clara al respecto: Al pasar el cursor sobre las pestañas en la última sección:

Hemos ampliado el vocabulario de HTML con un {[1 personalizado]} elemento. El tabs abstrae la compleja estructura HTML y el comportamiento necesario para el renderizado de tabs. El resultado es un más vista legible y sintaxis muy fácilmente reutilizable."

Luego en la siguiente pestaña:

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;
        }

Así que puedes inventar elementos html, es decir tabs y dejar que angular maneje la representación de esos elemento.

 2
Author: raam86,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-14 09:13:15