Directiva AngularJS Restringir A vs E


113

Estoy trabajando en un equipo pequeño, construyendo en AngularJS y tratando de mantener algunos estándares básicos y mejores prácticas; especialmente dado que somos relativamente nuevos con Angular.

Mi pregunta se refiere a las Directivas. Más exactamente, las restrictopciones.

Algunos de nosotros estamos usando restrict: 'E'así tener <my-directive></my-directive>en el html.

Otros están usando restrict: 'A'y teniendo <div my-directive></div>en html.

Entonces, por supuesto, puedes usar restrict: 'EA' y usar cualquiera de los anteriores.

Por el momento no es gran cosa, aunque cuando este proyecto sea tan grande como va a llegar, me gustaría que cualquiera que lo esté mirando para entender fácilmente lo que está pasando.

¿Hay ventajas / desventajas en la forma de hacer las cosas, ya sea por atributos o elementos?

¿Hay alguna trampa que debamos conocer si elegimos un elemento sobre un atributo?

Respuestas:


100

Según la documentación :

¿Cuándo debo usar un atributo frente a un elemento? Utilice un elemento cuando cree un componente que tenga el control de la plantilla. El caso común para esto es cuando está creando un lenguaje específico de dominio para partes de su plantilla. Utilice un atributo cuando esté decorando un elemento existente con una nueva funcionalidad.

Edite el siguiente comentario sobre las trampas para obtener una respuesta completa:

Suponiendo que está creando una aplicación que debería ejecutarse en Internet Explorer <= 8, cuya compatibilidad ha sido eliminada por el equipo de AngularJS de AngularJS 1.3, debe seguir las siguientes instrucciones para que funcione: https: //docs.angularjs .org / guide / ie


3
He leído esos documentos de arriba abajo, pero me perdí este :) gracias.
Darren Wainwright

3
Esta explicación no cubre los inconvenientes ni los pros / contras.
Konstantin Krass

Actualicé mi respuesta en consecuencia sobre las trampas. No mencioné pros / contras porque creo que estamos hablando más sobre las mejores prácticas aquí, especialmente cuando el equipo de Angular las recomienda y explica.
ngasull

1
"No mencioné pros / contras porque creo que estamos hablando más sobre las mejores prácticas aquí, especialmente cuando las recomienda y explica el equipo de Angular". eh :)
Alexander Mills

169

restrict es para definir el tipo de directiva, y puede ser A(Atributo), C(Clase), E(Elemento) y M(CoMment), supongamos que el nombre de la directiva es Doc:

Tipo: uso

A = <div Doc></div>

C = <div class="Doc"></div>

E = <Doc data="book_data"></Doc>

M = <!--directive:Doc -->


2
menos clara que la respuesta de @nikunj, pero después de ver su respuesta, entiendo la suya ...
Alexander Mills

47

La opción de restricción generalmente se establece en:

  • 'A': solo coincide con el nombre del atributo
  • 'E': solo coincide con el nombre del elemento
  • 'C' - solo coincide con el nombre de la clase
  • 'M' - solo coincide con el comentario

Aquí está el enlace de documentación .


simple y limpio
Gaurav_0093

7

El elemento no es compatible con IE8 de fábrica, debe hacer un trabajo para que IE8 acepte etiquetas personalizadas.

Una ventaja de utilizar un atributo sobre un elemento es que puede aplicar varias directivas al mismo nodo DOM. Esto es particularmente útil para cosas como controles de formulario donde puede resaltar, deshabilitar o agregar etiquetas, etc. con atributos adicionales sin tener que envolver el elemento en un montón de etiquetas.


5

Una de las trampas que conozco es el problema de IE con los elementos personalizados. Como se cita en los documentos :

3) no usa etiquetas de elementos personalizados como (use la versión del atributo en su lugar)

4) si usa etiquetas de elementos personalizados, debe seguir estos pasos para hacer feliz a IE 8 y versiones anteriores

<!doctype html>
  <html xmlns:ng="http://angularjs.org" id="ng-app" ng-app="optionalModuleName">
    <head>
      <!--[if lte IE 8]>
        <script>
          document.createElement('ng-include');
          document.createElement('ng-pluralize');
          document.createElement('ng-view');

          // Optionally these for CSS
          document.createElement('ng:include');
          document.createElement('ng:pluralize');
          document.createElement('ng:view');
        </script>
      <![endif]-->
    </head>
    <body>
      ...
    </body>
  </html>

4

Trampa:

  1. Usar su propio elemento html como <my-directive></my-directive>no funcionará en IE8 sin una solución alternativa ( https://docs.angularjs.org/guide/ie )
  2. El uso de sus propios elementos html hará que la validación html falle.
  3. Las directivas con un parámetro igual se pueden hacer así:

<div data-my-directive="ValueOfTheFirstParameter"></div>

En lugar de esto:

<my-directive my-param="ValueOfTheFirstParameter"></my-directive>

Nosotros no uso de elementos HTML personalizada, ya que si este 2 hechos.

Cada directiva de un marco de terceros se puede escribir de dos maneras:

<my-directive></my-directive>

o

<div data-my-directive></div>

hace lo mismo.


1
si desea crear una directiva con un parámetro de alcance igual, es más fácil hacerlo con A. Porque no tiene que crear un atributo adicional.
Konstantin Krass

¿A qué te refieres con adicional? Ambas alternativas tienen exactamente un atributo.
un mejor oliver

3

2 problemas con los elementos:

  1. Mala compatibilidad con navegadores antiguos.
  2. SEO: al motor de Google no le gustan.

Utilice atributos.


¿Las directivas como elementos pueden causar problemas de SEO? Estoy sorprendido. ¿Y el replaceatributo a true?
chalasr

1
Estas afirmaciones necesitan referencias. El punto 1 está bastante bien establecido en otros lugares, pero me encantaría ver fuentes sobre el punto 2.
rinogo
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.