AngularJS ng-include : Inclure des fichiers HTML avec exemple

⚡ Résumé intelligent

La directive ng-include d'AngularJS récupère, compile et injecte un fragment HTML externe dans la page principale, de sorte que les éléments de balisage partagés tels qu'un tableau, un en-tête ou un pied de page résident dans un seul fichier partiel réutilisable.

  • (I.e. Rôle directif : ng-include récupère un fragment externe et l'insère en tant que nœud enfant de son élément hôte.
  • ☑️ Chemin cité : La valeur src est une expression, donc un nom de fichier littéral doit être entouré de guillemets simples à l'intérieur de l'attribut.
  • ✅ Exemple concret : Le fichier Table.html est rendu via ng-repeat une fois que Main.html l'a injecté dans la div du contrôleur.
  • 🧪 Nouvelle portée enfant : Chaque inclusion crée une portée enfant, les liaisons primitives nécessitent donc la notation pointée.
  • ️ Inclure vide : Les règles d'origine identique, $sce et l'accès aux fichiers expliquent la plupart des résultats vides.
  • (I.e. Note de version : La prise en charge d'AngularJS a pris fin en janvier 2022 ; Angular moderne utilise désormais la composition de composants.

La directive ng-include dans AngularJS injecte un fichier HTML externe dans le modèle principal

Par défaut, HTML ne permet pas d'inclure du code côté client provenant d'autres fichiers. C'est normalement une bonne pratique dans n'importe quel langage de programmation de répartir les fonctionnalités sur différents fichiers pour n'importe quelle application.

Par exemple, si vous disposez d'une logique pour les opérations numériques, vous souhaiterez normalement que cette fonctionnalité soit définie dans un fichier distinct. Ce fichier séparé pourrait ensuite être réutilisé dans plusieurs applications en incluant simplement ce fichier.

C'est normalement le concept de Inclure des déclarations qui sont disponibles en langages de programmation tels que .Net et Java.

Ce tutoriel examine d'autres méthodes pour traiter les fichiers (fichiers contenant des données externes). HTML Le code) peut être inclus dans le fichier HTML principal.

Côté client

L'une des méthodes les plus courantes pour inclure du code HTML est via JavaScénario. Javascénario est un langage de programmation qui peut être utilisé pour manipuler le contenu d'une page HTML à la volée. Ainsi, JavaLe script peut également être utilisé pour inclure du code provenant d'autres fichiers.

Les étapes ci-dessous montrent comment y parvenir.

Étape 1) Définissez un fichier appelé Sub.html et ajoutez le code suivant au fichier.

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

Étape 2) Créez un fichier appelé Sample.html, qui est votre fichier d'application principal et ajoutez l'extrait de code ci-dessous.

Vous trouverez ci-dessous les principaux aspects à noter concernant le code ci-dessous,

  1. Dans la balise body, il y a une balise div qui a un identifiant Content. C'est l'endroit où sera inséré le code du fichier externe 'Sub.html'.
  2. Il est fait référence à un script jQuery. jQuery est un langage de script basé sur… JavaScript qui simplifie encore plus la manipulation du DOM.
  3. Dans l' JavaDans la fonction de script, il y a une instruction '$(“#Content”).load(“Sub.html”);' qui provoque l'injection du code du fichier Sub.html dans la balise div qui a l'id Content.
    <html> 
    	  <head> 
    	    <script src="jquery.js"></script> 
    	    <script> 
    	    $(function(){
    	      $("#Content").load("Sub.html"); 
    	    });
        </script> 
      </head> 
    
    <body> 
         <div id="Content"></div>
      </body> 
    </html>

Server Side Includes

Les inclusions côté serveur sont également disponibles pour inclure un morceau de code commun sur un site. Ceci est normalement fait pour inclure du contenu dans les parties ci-dessous d'un document HTML.

  1. En-tête de page
  2. Pied de page
  3. Le menu de navigation.

Pour qu'un serveur web reconnaisse un fichier inclus côté serveur (SCI), son nom doit comporter une extension spécifique. Ces extensions sont généralement acceptées par le serveur web, telles que .shtml, .stm, .shtm et .cgi.

La directive utilisée pour inclure du contenu est la « directive include ». Un exemple de la directive include est présenté ci-dessous :

<!--#include virtual="navigation.cgi" -->
  • La directive ci-dessus permet d'inclure le contenu d'un document dans un autre.
  • La commande « virtuelle » ci-dessus est utilisée pour spécifier la cible par rapport à la racine du domaine de l'application.
  • De plus, au paramètre virtuel, il existe également le paramètre file qui peut être utilisé. Les paramètres « file » sont utilisés lorsqu'il faut préciser le chemin relatif au répertoire du fichier courant.

Remarque:

Le paramètre virtual permet de spécifier le fichier (page HTML, fichier texte, script, etc.) qui doit être inclus. Si le processus du serveur Web n'a pas accès pour lire le fichier ou exécuter le script, la commande include échouera. Le mot « virtuel » est un mot-clé qui doit être placé dans la directive d'inclusion.

Comment inclure un fichier HTML dans AngularJS

AngularJS permet d'inclure des fonctionnalités provenant d'autres fichiers AngularJS en utilisant la directive ng-include. directive.

La fonction principale de la directive « ng-include » est de récupérer, compiler et inclure un fragment HTML externe dans l'application AngularJS principale.

Note de version : AngularJS 1.x n'est plus pris en charge à long terme depuis le 31 décembre 2021, et l'équipe du framework indique que Le support d'AngularJS a officiellement pris fin. En janvier 2022, aucune mise à jour ni correctif de sécurité n'a été publié depuis. Chaque étape et chaque bloc de code ci-dessous restent identiques à la version publiée, servant de référence historique. Angular moderne ne propose aucun remplacement direct : le balisage est composé de composants, et un fragment sélectionné à l'exécution est rendu avec ng-conteneur et ngComponentOutlet.

Examinons le code source ci-dessous et expliquons comment cela peut être réalisé à l'aide d'AngularJS.

Étape 1) écrivons le code ci-dessous dans un fichier appelé Table.html. C'est le fichier qui sera injecté dans notre fichier d'application principal à l'aide de la directive ng-include.

L'extrait de code ci-dessous suppose l'existence d'une variable de portée appelée « tutorial ». Il utilise ensuite… ng-répétition directive, qui parcourt chaque sujet de la variable « tutorial » et affiche les valeurs de « Name » et « Descriptpaire clé-valeur « ion ».

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

Étape 2) Écrivons le code ci-dessous dans un fichier nommé Main.html. Il s'agit d'une application AngularJS simple présentant les caractéristiques suivantes :

  1. Utilisez la « directive ng-include » pour injecter le code dans le fichier externe 'Table.html'. La déclaration a été mise en évidence en gras dans le code ci-dessous. Donc la balise div ' ' sera remplacé par l'intégralité du code dans le fichier 'Table.html'.
  2. Dans l' contrôleurUne variable « tutoriel » est créée dans le cadre de l’objet $scope. Cette variable contient une liste de paires clé-valeur.

Dans notre exemple, les paires clé-valeur sont

  1. Nom – Ceci indique le nom d'un sujet tel que les contrôleurs, les modèles et les directives.
  2. Description – Ceci donne une description de chaque sujet

La variable du didacticiel est également accessible dans le fichier '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>

Lorsque vous exécutez le code ci-dessus, vous obtiendrez le résultat suivant.

Sortie:

La capture d'écran ci-dessous montre le résultat rendu : l'onglet du navigateur affiche le titre « Inscription à l'événement », l'en-tête se situe au-dessus du tableau inséré, et les trois lignes proviennent du tableau « tutorial » du fichier Main.html via le modèle partiel. La capture d'écran annotée affiche l'en-tête « Gur99 », tandis que le code affiche : Guru99.

Affichage dans le navigateur de l'exemple AngularJS ng-include montrant le tableau des sujets injecté depuis Table.html

Attributs de ng-include : src, onload et autoscroll

Outre le nom de fichier, la directive accepte deux attributs optionnels et peut être écrite de trois manières : comme attribut sur n’importe quel élément, comme un <ng-include> élément, ou en tant que classe CSS. La référence ci-dessous suit la documentation officielle. documentation ngInclude.

Attribut Requis Ce qu'il fait
src, ou ng-include Oui Expression qui s'évalue au modèle URL
en charge Non L'expression est évaluée à chaque fois qu'une nouvelle partie a fini de charger
défilement automatique Non Appelle $anchorScroll après le chargement du contenu ; omettre l’attribut désactive le défilement
<div ng-include="'Table.html'" onload="loaded = true" autoscroll></div>
<ng-include src="templateUrl"></ng-include>

L'erreur la plus courante découle de la première ligne : src prend un expression, et non une simple chaîne de caractères. Un chemin littéral nécessite donc ses propres guillemets à l'intérieur de l'attribut, ce qui explique pourquoi l'exemple ci-dessus se lit comme suit : ng-include="'Table.html'". L'écriture ng-include="Table.html" fait évaluer AngularJS Table En tant que propriété de portée, ne rien trouver et laisser l'élément vide.

Pourquoi ng-include crée une nouvelle portée enfant

La directive n'insère pas de balisage dans la portée environnante. Chaque inclusion crée un nouvel enfant portée qui hérite de manière prototypale de la portée dans laquelle elle a été déclarée, et ce fait explique la plupart des surprises liées à la liaison.

La lecture fonctionne comme prévu. Le texte partiel ci-dessus se lit comme suit : tutorial directement des parents, c'est pourquoi ng-repeat trouve le tableau. C'est à l'écriture que ça coince : lorsqu'une variable partielle est assignée à une primitive, comme avec ng-model="topic"AngularJS crée topic au niveau de la portée enfant et la copie parente ne change jamais.

Deux habitudes permettent d'éviter le piège :

  • Lier par l'intermédiaire d'un objet, comme dans ng-model="data.topic", de sorte que le parent et l'enfant atteignent la même référence.
  • Stockez l'état dans un contrôleur ou un service et exposez des fonctions plutôt que des primitives brutes.

L'inclusion émet également $includeContentRequested, $includeContentLoaded et $includeContentError, afin qu'un parent puisse réagir par le biais de $scope.$on sans pour autant empiéter sur le domaine de l'enfance.

Comment corriger un fichier ng-include vide ou ayant échoué

Une inclusion qui ne produit aucun résultat échoue généralement pour l'une des quelques raisons suivantes. Examinez-les dans cet ordre.

  1. Vérifiez les devis. Un nom de fichier littéral doit être entouré de guillemets simples dans la valeur de l'attribut. Sans guillemets, l'expression est indéfinie et aucune requête n'est envoyée.
  2. Servez la page via HTTP. La directive émet une requête XHR pour la page partielle ; par conséquent, l’ouverture directe de Main.html depuis le disque via une adresse de fichier échoue dans la plupart des navigateurs. Tout serveur web local résout ce problème.
  3. Vérifiez que le chemin d'accès est résolu. Surveillez le panneau réseau pour la requête. Une erreur 404 signifie que le chemin est relatif à la page qui contient l'inclusion, et non à la vue partielle qui y fait référence.
  4. Respectez la règle de l'origine identique. Par défaut, le modèle URL doit correspondre au domaine et au protocole du document de l'application, car AngularJS le transmet. $sce.getTrustedResourceUrlUn modèle provenant d'une autre source doit figurer dans la ressource de confiance. URL une liste, ou un wrapper trustAsResourceUrl explicite, et le serveur distant doit toujours envoyer des en-têtes CORS.
  5. Soyez attentif aux signes d'échec. L'erreur $includeContentError se produit chaque fois que le statut de la réponse sort de la plage 200 à 299, transformant une zone silencieusement vide en un message digne d'être consigné.

Une autre cause, facile à oublier, est qu'AngularJS conserve chaque vue partielle récupérée dans `$templateCache`. Par conséquent, un fichier modifié peut continuer à afficher un balisage obsolète jusqu'à ce que l'entrée du cache soit supprimée ou que la page soit rechargée depuis la source. Lorsqu'un fragment nécessite un comportement spécifique plutôt qu'un simple balisage, un directive personnalisée Avec son propre modèle et son périmètre isolé, c'est le meilleur outil.

FAQ

ng-include injecte un fragment que vous nommez vous-même, n'importe où sur la page. ng-view affiche le modèle choisi. toupie cartes vers le courant URLet une seule vue ng-view appartient à une mise en page.

Non. Un partiel ne contient qu'un fragment. Envelopperping Dans les balises HTML, head ou body, des éléments parasites subsistent, car le balisage est inséré en tant que nœuds enfants de l'élément hôte plutôt que d'être analysé comme un document.

Non. Le fragment est compilé et inséré sous forme de nœuds DOM ; par conséquent, les éléments de script en ligne ne sont jamais exécutés. Chargez les scripts partagés depuis la page hôte ou déplacez ce comportement dans un contrôleur ou une directive.

Oui. Lorsque ngAnimate est chargé, la directive déclenche une animation d'entrée sur le fragment entrant et une animation de sortie sur le fragment sortant, et les deux s'exécutent simultanément à chaque modification de l'expression source.

Oui. Puisque la valeur est une expression, la lier à une propriété de portée inverse le fragment à chaque modification de cette propriété. Protégez l'élément avec ng-if afin qu'aucun élément ne soit chargé tant que la propriété ne contient pas un chemin valide.

Il n'existe pas d'équivalent. Le balisage réutilisable devient un composant, et un fragment choisi à l'exécution est rendu via ngComponentOutlet ou ngTemplateOutlet à l'intérieur d'un ng-container.

Les modèles de langage lisent un ensemble de modèles existants et regroupent les modèles partiels, les contrôleurs et les liaisons en composants candidats, puis proposent un ordre de migration. Considérez le résultat comme une première ébauche, car l'héritage de portée correspond rarement parfaitement aux entrées des composants.

Copilote GitHub Le mode agent convertit un composant partiel en un composant autonome avec des entrées typées et réécrit le modèle hôte, mais les liaisons et les tests générés nécessitent toujours une vérification humaine.

Résumez cet article avec :