AngularJS ng-include: Incluir archivos HTML con un ejemplo

โšก Resumen inteligente

En AngularJS, ng-include obtiene, compila e inyecta un fragmento HTML externo en la pรกgina principal, de modo que el marcado compartido, como una tabla, un encabezado o un pie de pรกgina, reside en un รบnico archivo parcial reutilizable.

  • ๐Ÿ”˜ Funciรณn directiva: ng-include obtiene un fragmento externo y lo inserta como nodos hijos de su elemento anfitriรณn.
  • โ˜‘๏ธ Ruta citada: El valor src es una expresiรณn, por lo que un nombre de archivo literal necesita comillas simples dentro del atributo.
  • โœ… Ejemplo trabajado: Table.html se renderiza a travรฉs de ng-repeat una vez que Main.html lo inyecta en el div del controlador.
  • ๐Ÿงช Nuevo alcance del niรฑo: Cada inclusiรณn crea un รกmbito secundario, por lo que las vinculaciones primitivas requieren la notaciรณn de puntos.
  • ๐Ÿ› ๏ธ En blanco se incluyen: Las reglas del mismo origen, $sce y el acceso a archivos explican la mayorรญa de los resultados vacรญos.
  • ๐Ÿ“Š Nota de versiรณn: El soporte para AngularJS finalizรณ en enero de 2022; en su lugar, la versiรณn moderna de Angular utiliza componentes.

Directiva ng-include en AngularJS que inyecta un archivo HTML externo en la plantilla principal.

De forma predeterminada, HTML no ofrece la posibilidad de incluir cรณdigo del lado del cliente de otros archivos. Normalmente es una buena prรกctica en cualquier lenguaje de programaciรณn distribuir la funcionalidad entre varios archivos para cualquier aplicaciรณn.

Por ejemplo, si tuviera lรณgica para operaciones numรฉricas, normalmente querrรญa tener esa funcionalidad definida en un archivo separado. Ese archivo separado podrรญa luego reutilizarse en mรบltiples aplicaciones con solo incluirlo.

Este es normalmente el concepto de Incluir declaraciones que estรกn disponibles en lenguajes de programaciรณn como .Net y Java.

Este tutorial examina otras formas de archivos (archivos que contienen archivos externos) HTML El cรณdigo) puede incluirse en el archivo HTML principal.

El lado del cliente incluye

Una de las formas mรกs comunes de incluir cรณdigo HTML es mediante JavaGuiรณn. JavaScript es un lenguaje de programaciรณn que se puede utilizar para manipular el contenido de una pรกgina HTML sobre la marcha. Por eso, JavaTambiรฉn se puede utilizar un script para incluir cรณdigo de otros archivos.

Los siguientes pasos muestran cรณmo se puede lograr esto.

Paso 1) Defina un archivo llamado Sub.html y agregue el siguiente cรณdigo al archivo.

<div>
	This is an included file
</div>

Paso 2) Cree un archivo llamado Sample.html, que es el archivo principal de su aplicaciรณn y agregue el siguiente fragmento de cรณdigo.

A continuaciรณn se detallan los aspectos principales a tener en cuenta sobre el siguiente cรณdigo,

  1. En la etiqueta del cuerpo, hay una etiqueta div que tiene una identificaciรณn de Contenido. Este es el lugar donde se insertarรก el cรณdigo del archivo externo 'Sub.html'.
  2. Hay una referencia a un script jQuery. jQuery es un lenguaje de scripting construido sobre JavaScript que facilita aรบn mรกs la manipulaciรณn del DOM.
  3. En la secciรณn JavaFunciรณn de script, hay una instrucciรณn '$(โ€œ#Contentโ€).load(โ€œSub.htmlโ€);' que hace que el cรณdigo del archivo Sub.html se inyecte en la etiqueta div que tiene el id Content.
    <html> 
    	  <head> 
    	    <script src="jquery.js"></script> 
    	    <script> 
    	    $(function(){
    	      $("#Content").load("Sub.html"); 
    	    });
        </script> 
      </head> 
    
    <body> 
         <div id="Content"></div>
      </body> 
    </html>

El lado del servidor incluye

Las inclusiones del lado del servidor tambiรฉn estรกn disponibles para incluir un fragmento de cรณdigo comรบn en todo un sitio. Normalmente, esto se hace para incluir contenido en las partes siguientes de un documento HTML.

  1. Encabezado de pรกgina
  2. Pie de pรกgina
  3. Menรบ de Navegaciรณn.

Para que un servidor web reconozca un Server Side Include, los nombres de archivo deben tener extensiones especiales. Generalmente, el servidor web acepta extensiones como .shtml, .stm, .shtm y .cgi.

La directiva que se utiliza para incluir contenido es la directiva โ€œincludeโ€. A continuaciรณn se muestra un ejemplo de la directiva include:

<!--#include virtual="navigation.cgi" -->
  • La directiva anterior permite incluir el contenido de un documento en otro.
  • El comando "virtual" anterior al cรณdigo se utiliza para especificar el objetivo en relaciรณn con la raรญz del dominio de la aplicaciรณn.
  • Ademรกs, para el parรกmetro virtual, tambiรฉn existe el parรกmetro de archivo que se puede utilizar. Los parรกmetros de "archivo" se utilizan cuando es necesario especificar la ruta relativa al directorio del archivo actual.

Nota:

El parรกmetro virtual se utiliza para especificar el archivo (pรกgina HTML, archivo de texto, script, etc.) que debe incluirse. Si el proceso del servidor web no tiene acceso para leer el archivo o ejecutar el script, el comando de inclusiรณn fallarรก. La palabra "virtual" es una palabra clave que debe colocarse en la directiva de inclusiรณn.

Cรณmo incluir un archivo HTML en AngularJS

AngularJS Proporciona la funciรณn para incluir la funcionalidad de otros archivos AngularJS mediante el uso de ng-include. Directivas.

El objetivo principal de la directiva โ€œng-includeโ€ es obtener, compilar e incluir un fragmento HTML externo en la aplicaciรณn principal de AngularJS.

Nota de versiรณn: AngularJS 1.x dejรณ de tener soporte a largo plazo el 31 de diciembre de 2021, y el equipo del framework afirma que El soporte para AngularJS ha finalizado oficialmente. en enero de 2022, por lo que no hay lanzamientos ni parches de seguridad posteriores. Cada paso y bloque de cรณdigo a continuaciรณn permanece exactamente como se publicรณ, como referencia histรณrica. Angular moderno no incluye un reemplazo directo: el marcado se compone de componentes y un fragmento seleccionado en tiempo de ejecuciรณn se renderiza con ng-contenedor y ngComponentOutlet.

Analicemos el siguiente cรณdigo fuente y expliquemos cรณmo se puede lograr esto utilizando AngularJS.

Paso 1) Escribamos el siguiente cรณdigo en un archivo llamado Table.html. Este es el archivo que se inyectarรก en el archivo de nuestra aplicaciรณn principal mediante la directiva ng-include.

El siguiente fragmento de cรณdigo asume que existe una variable de รกmbito llamada "tutorial". Luego utiliza la ng-repetir directiva, que recorre cada tema en la variable โ€œtutorialโ€ y muestra los valores para 'Name' y 'DescriptPar clave-valor de ion.

<table>
    <tr ng-repeat="Topic in tutorial">
        <td>{{ Topic.Name }}</td>
        <td>{{ Topic.Description }}</td>
    </tr>
</table>

Paso 2) Escribamos el siguiente cรณdigo en un archivo llamado Main.html. Esta es una aplicaciรณn AngularJS simple que tiene los siguientes aspectos.

  1. Utilice la "directiva ng-include" para inyectar el cรณdigo en el archivo externo 'Table.html'. La declaraciรณn se ha resaltado en negrita en el siguiente cรณdigo. Entonces la etiqueta div ' ' serรก reemplazado por el cรณdigo completo en el archivo 'Table.html'.
  2. En la secciรณn controladorSe crea una variable llamada โ€œtutorialโ€ como parte del objeto $scope. Esta variable contiene una lista de pares clave-valor.

En nuestro ejemplo, los pares clave-valor son

  1. Nombre: indica el nombre de un tema, como controladores, modelos y directivas.
  2. Description โ€“ Esto proporciona una descripciรณn de cada tema.

Tambiรฉn se accede a la variable del tutorial en el archivo 'Table.html'.

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Event Registration</title>
        <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.6.4/angular.min.js"></script>
</head>
<body ng-app="sampleApp">
<div ng-controller="AngularController">
    <h3> Guru99 Global Event</h3>
		<div ng-include="'Table.html'"></div>
</div>
<script>

    var sampleApp = angular.module('sampleApp',[]);
    sampleApp.controller('AngularController', function($scope) {
        $scope.tutorial =[
            {Name: "Controllers" , Description : "Controllers in action"},
            {Name: "Models" , Description : "Models and binding data"},
            {Name: "Directives" , Description : "Flexibility of Directives"}
        ];

    });
</script>
</body>
</html>

Cuando ejecute el cรณdigo anterior, obtendrรก el siguiente resultado.

Resultado:

La captura a continuaciรณn muestra el resultado renderizado: la pestaรฑa del navegador lleva el tรญtulo Registro de eventos, el encabezado se encuentra encima de la tabla inyectada y las tres filas se extraen del array del tutorial en Main.html a travรฉs de la parcial. La captura de pantalla anotada deletrea el encabezado Gur99 mientras que el cรณdigo escribe Guru99.

Salida del navegador del ejemplo ng-include de AngularJS que muestra la tabla de temas inyectada desde Table.html.

Atributos de ng-include: src, onload y autoscroll

Mรกs allรก del nombre del archivo, la directiva acepta dos atributos opcionales y se puede escribir de tres maneras: como un atributo en cualquier elemento, como un <ng-include> elemento, o como una clase CSS. La referencia a continuaciรณn sigue la oficial Documentaciรณn de ngInclude.

Atributo Obligatorio ยฟQuรฉ hace?
src o ng-include Sรญ: Expresiรณn que se evalรบa segรบn la plantilla URL
onload No La expresiรณn se evalรบa cada vez que finaliza la carga de un nuevo fragmento.
desplazamiento automรกtico No Llama a $anchorScroll despuรฉs de que se carga el contenido; omitir el atributo desactiva el desplazamiento.
<div ng-include="'Table.html'" onload="loaded = true" autoscroll></div>
<ng-include src="templateUrl"></ng-include>

El error mรกs comรบn se deduce de la primera fila: src toma un expresiรณn, no una cadena simple. Por lo tanto, una ruta literal necesita sus propias comillas dentro del atributo, razรณn por la cual el ejemplo anterior se lee ng-include="'Table.html'". Escritura ng-include="Table.html" hace que AngularJS evalรบe Table Como propiedad de รกmbito, no encuentra nada y deja el elemento vacรญo.

ยฟPor quรฉ ng-include crea un nuevo รกmbito secundario?

La directiva no pega marcado en el รกmbito circundante. Cada inclusiรณn crea un nuevo elemento hijo. global que hereda prototรญpicamente del รกmbito en el que fue declarado, y ese hecho explica la mayorรญa de las sorpresas vinculantes.

La lectura funciona como se esperaba. El fragmento anterior dice: tutorial directamente de los padres, por eso ng-repeat encuentra el array. El problema surge al escribir: cuando una asignaciรณn parcial se realiza a un tipo primitivo, como con ng-model="topic"AngularJS crea topic en el รกmbito secundario y la copia principal nunca cambia.

Dos hรกbitos evitan la trampa:

  • Vincular a travรฉs de un objeto, como en ng-model="data.topic", de modo que padre e hijo llegan a la misma referencia.
  • Mantรฉn el estado en un controlador o un servicio y expรณn funciones en lugar de simples primitivas.

El incluido tambiรฉn emite $includeContentRequested, $includeContentLoaded y $includeContentError, para que un padre pueda reaccionar a travรฉs de $scope.$on sin acceder en absoluto al รกmbito secundario.

Cรณmo solucionar un error de ng-include o un error en este archivo.

Una inclusiรณn que no produce ningรบn resultado suele fallar por alguna de las siguientes razones. Analรญcelas en este orden.

  1. Comprueba las cotizaciones. Un nombre de archivo literal necesita comillas simples dentro del valor del atributo. Sin ellas, la expresiรณn se resuelve como indefinida y no se envรญa ninguna solicitud.
  2. Sirva la pรกgina a travรฉs de HTTP. La directiva realiza una solicitud XHR para el archivo parcial, por lo que abrir Main.html directamente desde el disco mediante una ruta de archivo falla en la mayorรญa de los navegadores. Cualquier servidor web local soluciona este problema.
  3. Confirme que la ruta se resuelve. Observa el panel de red para ver la solicitud. Un error 404 significa que la ruta es relativa a la pรกgina que aloja la inclusiรณn, no a la plantilla parcial que la referencia.
  4. Respetar la regla del mismo origen. Por defecto la plantilla URL debe coincidir con el dominio y el protocolo del documento de la aplicaciรณn, porque AngularJS lo pasa a travรฉs de $sce.getTrustedResourceUrlUna plantilla de otro lugar necesita una entrada en el recurso de confianza. URL lista, o un contenedor trustAsResourceUrl explรญcito, y el servidor remoto aรบn tiene que enviar encabezados CORS.
  5. Presta atenciรณn al fallo. La excepciรณn $includeContentError se activa siempre que el estado de la respuesta se encuentre fuera del rango 200 a 299, convirtiendo un รกrea silenciosamente en blanco en un mensaje que merece ser registrado.

Otra causa es fรกcil de pasar por alto. AngularJS guarda cada parcial obtenido en $templateCache, por lo que un archivo editado puede seguir sirviendo marcado obsoleto hasta que se elimine la entrada de cachรฉ o se vuelva a cargar la pรกgina desde el origen. Cuando un fragmento necesita un comportamiento propio en lugar de solo marcado, directiva personalizada Con su propia plantilla y alcance aislado, es la mejor herramienta.

Preguntas Frecuentes

ng-include inyecta un fragmento que tรบ mismo nombres, en cualquier parte de la pรกgina. ng-view renderiza la plantilla que sea. Router mapas a la actualidad URLy solo un ng-view pertenece a un diseรฑo.

No. Una parcial contiene solo un fragmento. Envolturaping Si se inserta en las etiquetas html, head o body, deja elementos sueltos, porque el marcado se inserta como nodos secundarios del elemento anfitriรณn en lugar de analizarse como un documento.

No. El fragmento se compila y se inserta como nodos DOM, por lo que los elementos de script en lรญnea nunca se ejecutan. Cargue los scripts compartidos desde la pรกgina principal o mueva el comportamiento a un controlador o una directiva.

Sรญ. Con ngAnimate cargado, la directiva activa una animaciรณn de entrada en el fragmento entrante y una animaciรณn de salida en el saliente, y ambas se ejecutan simultรกneamente cada vez que cambia la expresiรณn de origen.

Sรญ. Dado que el valor es una expresiรณn, al apuntar a una propiedad del รกmbito se intercambia el fragmento cada vez que cambia dicha propiedad. Protege el elemento con ng-if para que no se cargue nada hasta que la propiedad contenga una ruta real.

No existe un equivalente. El marcado reutilizable se convierte en un componente, y un fragmento elegido en tiempo de ejecuciรณn se renderiza a travรฉs de ngComponentOutlet o ngTemplateOutlet dentro de un ng-container.

Los modelos de lenguaje leen un conjunto de plantillas heredadas y agrupan las plantillas parciales, los controladores y las vinculaciones en componentes candidatos, para luego proponer un orden de migraciรณn. Considere el resultado como un primer borrador, ya que la herencia de รกmbito rara vez se corresponde directamente con las entradas de los componentes.

Copiloto de GitHub El modo agente convierte un componente parcial en un componente independiente con entradas tipadas y reescribe la plantilla del host, pero los enlaces y las pruebas generados aรบn necesitan revisiรณn humana.

Resumir este post con: