AngularJS ng-include: Includi file HTML con esempio

โšก Riepilogo intelligente

In AngularJS, `ng-include` recupera, compila e inserisce un frammento HTML esterno nella pagina principale, in modo che il markup condiviso, come una tabella, un'intestazione o un piรจ di pagina, risieda in un unico file parziale riutilizzabile.

  • ๐Ÿ”˜ Ruolo direttivo: ng-include recupera un frammento esterno e lo inserisce come nodo figlio del suo elemento host.
  • โ˜‘๏ธ Percorso tra virgolette: Il valore di src รจ un'espressione, quindi un nome di file letterale deve essere racchiuso tra virgolette singole all'interno dell'attributo.
  • โœ… Esempio pratico: Il file Table.html viene renderizzato tramite ng-repeat una volta che Main.html lo inserisce nel div del controller.
  • ๐Ÿงช Nuovo ambito figlio: Ogni inclusione crea un ambito figlio, quindi i collegamenti primitivi richiedono la notazione con il punto.
  • ๏ธ Gli spazi vuoti includono: Le regole di same-origin, $sce e l'accesso ai file spiegano la maggior parte dei risultati vuoti.
  • ๐Ÿ“Š Nota sulla versione: Il supporto per AngularJS รจ terminato a gennaio 2022; la versione moderna di Angular utilizza invece i componenti.

Direttiva ng-include in AngularJS per l'inserimento di un file HTML esterno nel template principale

Per impostazione predefinita, l'HTML non fornisce la possibilitร  di includere codice lato client da altri file. Normalmente รจ una buona pratica in qualsiasi linguaggio di programmazione distribuire le funzionalitร  su vari file per qualsiasi applicazione.

Ad esempio, se avessi la logica per le operazioni numeriche, normalmente vorresti che quella funzionalitร  fosse definita in un file separato. Quel file separato potrebbe quindi essere riutilizzato in piรน applicazioni includendo semplicemente quel file.

Questo รจ normalmente il concetto di Includi dichiarazioni che sono disponibili in linguaggi di programmazione come .Net e Java.

Questo tutorial esamina altri modi in cui i file (file che contengono elementi esterni) HTML il codice) puรฒ essere incluso nel file HTML principale.

Il lato client include

Uno dei modi piรน comuni per includere il codice HTML รจ tramite JavaScript. JavaCopione รจ un linguaggio di programmazione che puรฒ essere utilizzato per manipolare al volo il contenuto di una pagina HTML. Quindi, JavaGli script possono essere utilizzati anche per includere codice da altri file.

I passaggi seguenti mostrano come รจ possibile raggiungere questo obiettivo.

Passo 1) Definisci un file denominato Sub.html e aggiungi il seguente codice al file.

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

Passo 2) Crea un file chiamato Sample.html, che รจ il file dell'applicazione principale e aggiungi lo snippet di codice seguente.

Di seguito sono riportati gli aspetti principali da notare sul codice seguente,

  1. Nel tag body รจ presente un tag div che ha l'ID Content. Questo รจ il posto dove verrร  inserito il codice del file esterno 'Sub.html'.
  2. C'รจ un riferimento a uno script jQuery. jQuery รจ un linguaggio di scripting costruito sopra JavaScript che semplifica ulteriormente la manipolazione del DOM.
  3. Nel JavaNella funzione script รจ presente l'istruzione '$(โ€œ#Contentโ€).load(โ€œSub.htmlโ€);' che fa sรฌ che il codice contenuto nel file Sub.html venga inserito nel tag div con 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

Sono disponibili anche Server Side Include per includere una parte comune di codice in un sito. Questo viene normalmente fatto per includere contenuto nelle parti seguenti di un documento HTML.

  1. Intestazione di pagina
  2. Piรจ di pagina
  3. Menu di navigazione.

Affinchรฉ un server web riconosca un Server Side Include, i nomi dei file devono avere estensioni speciali. Solitamente, i server web accettano estensioni come .shtml, .stm, .shtm e .cgi.

La direttiva utilizzata per includere contenuti รจ la "direttiva include". Un esempio della direttiva include รจ mostrato di seguito:

<!--#include virtual="navigation.cgi" -->
  • La suddetta direttiva consente di includere il contenuto di un documento in un altro.
  • Il comando "virtuale" sopra riportato nel codice viene utilizzato per specificare la destinazione relativa alla radice del dominio dell'applicazione.
  • Inoltre, oltre al parametro virtuale, c'รจ anche il parametro file che puรฒ essere utilizzato. I parametri โ€œfileโ€ vengono utilizzati quando รจ necessario specificare il percorso relativo alla directory del file corrente.

Nota:

Il parametro virtual viene utilizzato per specificare il file (pagina HTML, file di testo, script, ecc.) da includere. Se il processo del server Web non ha accesso per leggere il file o eseguire lo script, il comando include fallirร . La parola "virtuale" รจ una parola chiave che deve essere inserita nella direttiva include.

Come includere il file HTML in AngularJS

AngularJS fornisce la funzione per includere la funzionalitร  da altri file AngularJS utilizzando ng-include Direttive.

Lo scopo principale della direttiva "ng-include" รจ quello di recuperare, compilare e includere un frammento HTML esterno nell'applicazione AngularJS principale.

Nota sulla versione: AngularJS 1.x ha lasciato il supporto a lungo termine il 31 dicembre 2021 e il team del framework dichiara che Il supporto per AngularJS รจ ufficialmente terminato. nel gennaio 2022, quindi non seguono rilasci o patch di sicurezza. Ogni passaggio e blocco di codice sottostante rimane esattamente come pubblicato, come riferimento storico. Angular moderno non fornisce alcun sostituto diretto: il markup รจ composto da componenti e un frammento selezionato in fase di esecuzione viene renderizzato con ng-container e ngComponentOutlet.

Analizziamo il codice sorgente riportato di seguito e spieghiamo come questo risultato puรฒ essere ottenuto utilizzando AngularJS.

Passo 1) scriviamo il codice seguente in un file chiamato Table.html. Questo รจ il file che verrร  inserito nel file della nostra applicazione principale utilizzando la direttiva ng-include.

Il seguente frammento di codice presuppone che esista una variabile di ambito chiamata "tutorial". Quindi utilizza il ng-ripetere direttiva, che passa attraverso ogni argomento nella variabile โ€œtutorialโ€ e visualizza i valori per 'Nome' e 'Descriptcoppia chiave-valore ion'.

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

Passo 2) Scriviamo il codice seguente in un file chiamato Main.html. Questa รจ una semplice applicazione AngularJS che presenta i seguenti aspetti

  1. Utilizzare la "direttiva ng-include" per inserire il codice nel file esterno "Table.html". La dichiarazione รจ stata evidenziata in grassetto nel codice seguente. Quindi il tag div ' ' verrร  sostituito dall'intero codice nel file "Table.html".
  2. Nel controlloreViene creata una variabile "tutorial" come parte dell'oggetto $scope. Questa variabile contiene un elenco di coppie chiave-valore.

Nel nostro esempio, le coppie chiave-valore sono

  1. Nome: indica il nome di un argomento come Controller, Modelli e Direttive.
  2. Descriptione โ€“ Fornisce una descrizione di ciascun argomento

รˆ possibile accedere alla variabile tutorial anche nel file "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>

Quando esegui il codice sopra, otterrai il seguente output.

Uscita:

L'immagine qui sotto mostra il risultato renderizzato: la scheda del browser riporta il titolo Registrazione all'evento, l'intestazione si trova sopra la tabella iniettata e le tre righe vengono disegnate dall'array tutorial in Main.html tramite il partial. Lo screenshot annotato riporta l'intestazione Gur99 mentre il codice scrive Guru99

Output del browser dell'esempio ng-include di AngularJS che mostra la tabella degli argomenti iniettata da Table.html

ng-include Attributi: src, onload e autoscroll

Oltre al nome del file, la direttiva accetta due attributi opzionali e puรฒ essere scritta in tre modi: come attributo su qualsiasi elemento, come un <ng-include> elemento, o come classe CSS. Il riferimento seguente segue l'ufficiale documentazione di ngInclude.

Attributo Obbligatorio Ciรฒ che fa
src o ng-include Si Espressione che si valuta nel modello URL
caricare Non Espressione valutata ogni volta che un nuovo caricamento parziale termina
scorrimento automatico Non Chiama $anchorScroll dopo il caricamento del contenuto; omettendo l'attributo si disabilita lo scorrimento.
<div ng-include="'Table.html'" onload="loaded = true" autoscroll></div>
<ng-include src="templateUrl"></ng-include>

L'errore piรน comune si trova nella prima riga: src prende un espressione, non una semplice stringa. Un percorso letterale necessita quindi delle proprie virgolette all'interno dell'attributo, motivo per cui l'esempio precedente recita ng-include="'Table.html'". scrittura ng-include="Table.html" fa valutare AngularJS Table come proprietร  di ambito, non trova nulla e lascia l'elemento vuoto.

Perchรฉ ng-include crea un nuovo ambito figlio

La direttiva non incolla il markup nello scope circostante. Ogni include crea un nuovo figlio portata che eredita prototipicamente dall'ambito in cui รจ stato dichiarato, e che un singolo fatto spiega la maggior parte delle sorprese vincolanti.

La lettura funziona come previsto. La parte sopra riportata recita: tutorial direttamente dal genitore, ecco perchรฉ ng-repeat trova l'array. La scrittura รจ dove si verifica l'errore: quando un parziale assegna a un primitivo, come con ng-model="topic", AngularJS crea topic nell'ambito figlio e la copia padre non cambia mai.

Due abitudini evitano la trappola:

  • Legare attraverso un oggetto, come in ng-model="data.topic", quindi genitore e figlio raggiungono lo stesso riferimento.
  • Gestisci lo stato in un controller o in un servizio ed esponi funzioni anzichรฉ semplici tipi primitivi.

L'inclusione emette anche $includeContentRequested, $includeContentLoaded and $includeContentError, in modo che un genitore possa reagire attraverso $scope.$on senza intaccare minimamente la sfera infantile.

Come correggere un ng-include vuoto o non riuscito

Un'inclusione che non produce alcun output di solito fallisce per uno dei seguenti motivi. Analizziamoli in quest'ordine.

  1. Controlla i preventivi. Un nome di file letterale deve essere racchiuso tra virgolette singole all'interno del valore dell'attributo. Senza di esse, l'espressione risulta indefinita e non viene inviata alcuna richiesta.
  2. Servire la pagina tramite HTTP. La direttiva genera una richiesta XHR per il partial, pertanto l'apertura di Main.html direttamente dal disco tramite indirizzo file non funziona nella maggior parte dei browser. Qualsiasi server web locale risolve questo problema.
  3. Verificare che il percorso sia risolto. Controlla il pannello di rete per la richiesta. Un errore 404 significa che il percorso รจ relativo alla pagina che ospita l'inclusione, non al partial che la referenzia.
  4. Rispetta la regola della stessa origine. Per impostazione predefinita il modello URL deve corrispondere al dominio e al protocollo del documento dell'applicazione, perchรฉ AngularJS lo passa attraverso $sce.getTrustedResourceUrlUn modello proveniente da un'altra fonte necessita di una voce nell'elenco delle risorse attendibili. URL elenco, oppure un wrapper trustAsResourceUrl esplicito, e il server remoto deve comunque inviare le intestazioni CORS.
  5. Presta attenzione al fallimento. L'evento $includeContentError si verifica ogni volta che lo stato della risposta รจ al di fuori dell'intervallo 200-299, trasformando un'area vuota in un messaggio che vale la pena registrare.

Un'altra causa รจ facile da non notare. AngularJS mantiene ogni partial recuperato in $templateCache, quindi un file modificato puรฒ continuare a servire markup obsoleto finchรฉ la voce della cache non viene rimossa o la pagina non viene ricaricata dal codice sorgente. Quando un frammento ha bisogno di un comportamento proprio piuttosto che del solo markup, un Direttiva personalizzata con il suo modello predefinito e il suo ambito isolato รจ lo strumento migliore.

DOMANDE FREQUENTI

ng-include inietta un frammento che nomini tu stesso, ovunque sulla pagina. ng-view renderizza qualsiasi modello il router mappe attuali URLe in un layout puรฒ essere presente un solo ng-view.

No. Un parziale contiene solo un frammento. Avvolgimentoping Se inserito nei tag HTML, head o body, lascia degli elementi residui, perchรฉ il markup viene inserito come nodo figlio dell'elemento host anzichรฉ essere analizzato come un documento.

No. Il frammento viene compilato e inserito come nodo DOM, quindi gli elementi script inline non vengono mai eseguiti. Carica gli script condivisi dalla pagina host oppure sposta il comportamento in un controller o in una direttiva.

Sรฌ. Con ngAnimate caricato, la direttiva attiva un'animazione di ingresso sul frammento in entrata e un'animazione di uscita su quello in uscita, e le due vengono eseguite contemporaneamente ogni volta che l'espressione sorgente cambia.

Sรฌ. Poichรฉ il valore รจ un'espressione, puntandolo a una proprietร  di scope, il frammento viene sostituito ogni volta che tale proprietร  cambia. Proteggi l'elemento con ng-if in modo che non venga caricato nulla finchรฉ la proprietร  non contiene un percorso valido.

Non esiste un equivalente. Il markup riutilizzabile diventa un componente e un frammento scelto in fase di esecuzione viene renderizzato tramite ngComponentOutlet oppure ngTemplateOutlet all'interno di un ng-container.

I modelli linguistici leggono un set di modelli legacy e raggruppano partial, controller e binding in componenti candidati, quindi propongono un ordine di migrazione. Considera l'output come una prima bozza, perchรฉ l'ereditarietร  dello scope raramente si mappa in modo pulito sugli input dei componenti.

Copilota GitHub La modalitร  agente converte un partial in un componente autonomo con input tipizzati e riscrive il template host, tuttavia i binding e i test generati necessitano comunque di una revisione umana.

Riassumi questo post con: