AngularJS ng-include: Включення HTML-файлів з прикладом

⚡ Розумний підсумок

ng-include в AngularJS отримує, компілює та вставляє зовнішній фрагмент HTML на головну сторінку, тому спільна розмітка, така як таблиця, заголовок або нижній колонтитул, зберігається в одному частковому файлі, який можна використовувати повторно.

  • 🔘 Директивна роль: ng-include отримує зовнішній фрагмент та вставляє його як дочірні вузли свого елемента host.
  • ☑️ Цитований шлях: Значення src є виразом, тому буквальне ім'я файлу потребує одинарних лапок всередині атрибута.
  • Приклад роботи: Table.html рендериться через ng-repeat після того, як Main.html вставляє його в div контролера.
  • 🧪 Нова дочірня область дії: Кожне включення створює дочірню область видимості, тому примітивні зв'язки вимагають крапкової нотації.
  • 🛠️ Пусті включають: Правила однакового походження, $sce та доступ до файлів пояснюють більшість порожніх результатів.
  • 📊 Примітка до версії: Підтримка AngularJS припинилася у січні 2022 року; сучасний Angular натомість компонує компоненти.

Директива ng-include в AngularJS для вставки зовнішнього HTML-файлу в основний шаблон

За замовчуванням HTML не надає можливості включати клієнтський код з інших файлів. Зазвичай у будь-якій мові програмування є хорошою практикою розподіляти функції між різними файлами для будь-якої програми.

Наприклад, якби у вас була логіка для числових операцій, ви, як правило, хотіли б мати цю функціональність визначену в одному окремому файлі. Цей окремий файл можна було б повторно використовувати в кількох програмах, просто включивши цей файл.

Зазвичай це концепція Включайте заяви які доступні в мови програмування такі як .Net та Java.

У цьому посібнику розглядаються інші способи роботи з файлами (файлами, що містять зовнішні HTML код) можна включити до основного HTML-файлу.

Включає сторону клієнта

Один з найпоширеніших способів включення HTML-коду – це через JavaСценарій. JavaScript це мова програмування, яка може бути використана для маніпулювання вмістом сторінки HTML на льоту. Отже, JavaСкрипт також можна використовувати для включення коду з інших файлів.

Наведені нижче кроки показують, як цього можна досягти.

Крок 1) Визначте файл під назвою Sub.html і додайте до нього наступний код.

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

Крок 2) Створіть файл під назвою Sample.html, який є основним файлом програми, і додайте наведений нижче фрагмент коду.

Нижче наведено основні аспекти коду, на які слід звернути увагу.

  1. У тегу body є тег div, який має ідентифікатор вмісту. Це місце, куди буде вставлено код із зовнішнього файлу "Sub.html".
  2. Є посилання на скрипт jQuery. jQuery — це мова сценаріїв, побудована на основі JavaСкрипт, який ще більше спрощує маніпуляції з DOM.
  3. Перейдіть на вкладку JavaУ функції скрипта є оператор '$(“#Content”).load(“Sub.html”);', який призводить до вставки коду з файлу Sub.html у тег div з ідентифікатором Content.
    <html> 
    	  <head> 
    	    <script src="jquery.js"></script> 
    	    <script> 
    	    $(function(){
    	      $("#Content").load("Sub.html"); 
    	    });
        </script> 
      </head> 
    
    <body> 
         <div id="Content"></div>
      </body> 
    </html>

Серверна сторона включає в себе

Серверні включення також доступні для включення звичайного фрагмента коду на весь сайт. Зазвичай це робиться для включення вмісту в наведені нижче частини документа HTML.

  1. Заголовок сторінки
  2. Нижній колонтитул сторінки
  3. Навігаційне меню.

Щоб веб-сервер розпізнав Server Side Include, імена файлів мають спеціальні розширення. Зазвичай веб-сервер приймає їх, такі як .shtml, .stm, .shtm, .cgi.

Директива, яка використовується для включення контенту, називається «директива include». Приклад директиви include наведено нижче:

<!--#include virtual="navigation.cgi" -->
  • Наведена вище директива дозволяє включати вміст одного документа в інший.
  • Наведена вище команда «віртуальна» використовується для вказівки цілі відносно кореня домену програми.
  • Окрім віртуального параметра, є також параметр файлу, який можна використовувати. Параметри «файл» використовуються, коли потрібно вказати шлях відносно каталогу поточного файлу.

Примітка:

Віртуальний параметр використовується для визначення файлу (сторінки HTML, текстового файлу, сценарію тощо), який необхідно включити. Якщо процес веб-сервера не має доступу для читання файлу або виконання сценарію, команда include не вдасться виконати. «Віртуальне» слово — це ключове слово, яке необхідно розмістити в директиві include.

Як включити файл HTML в AngularJS

AngularJS надає функцію для включення функціональності з інших файлів AngularJS за допомогою ng-include директива.

Основне призначення директиви «ng-include» — це отримання, компіляція та включення зовнішнього фрагмента HTML в основний застосунок AngularJS.

Примітка до версії: AngularJS 1.x припинив довгострокову підтримку 31 грудня 2021 року, і команда розробників фреймворку заявляє, що Підтримка AngularJS офіційно припинена у січні 2022 року, тому жодних релізів чи патчів безпеки не буде. Кожен крок і блок коду, наведені нижче, залишаються точно такими, як опубліковано, як історичне посилання. Сучасний Angular не постачає прямої заміни: розмітка складається з компонентів, а фрагмент, вибраний під час виконання, рендериться за допомогою ng-контейнер і ngComponentOutlet.

Давайте розглянемо наведену нижче кодову базу та пояснимо, як цього можна досягти за допомогою AngularJS.

Крок 1) запишемо наведений нижче код у файлі під назвою Table.html. Це файл, який буде вставлено в наш основний файл програми за допомогою директиви ng-include.

У наведеному нижче фрагменті коду припускається, що існує змінна області видимості під назвою «tutorial». Потім використовується ng-повтор директива, яка переглядає кожну тему у змінній «tutorial» та відображає значення для «Name» та «Descriptпара ключ-значення ion.

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

Крок 2) Давайте напишемо наведений нижче код у файлі під назвою Main.html. Це простий AngularJS-застосунок, який має такі аспекти

  1. Використовуйте директиву «ng-include», щоб додати код у зовнішній файл «Table.html». Заява виділена жирним шрифтом у коді нижче. Тож тег div ' ' буде замінено на весь код у файлі 'Table.html'.
  2. Перейдіть на вкладку контролер, як частина об'єкта $scope створюється змінна-"підручник". Ця змінна містить список пар ключ-значення.

У нашому прикладі пари ключ-значення є

  1. Назва – це вказує на назву теми, як-от контролери, моделі та директиви.
  2. Description – це опис кожної теми

Змінна підручника також доступна у файлі «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>

Коли ви виконаєте наведений вище код, ви отримаєте наступний результат.

Вихід:

Знімок екрана нижче показує відображений результат: вкладка браузера має заголовок «Реєстрація події», заголовок розташований над вставленою таблицею, а три рядки витягуються з масиву навчального посібника в Main.html через частковий елемент. На скріншоті з анотаціями написано заголовок Gur99, поки код записує. Guru99.

Вивід браузера для прикладу AngularJS ng-include, що показує таблицю тем, вставлену з Table.html

Атрибути ng-include: src, onload та autoscroll

Окрім імені файлу, директива приймає два необов'язкові атрибути, і її можна записати трьома способами: як атрибут будь-якого елемента, як <ng-include> елемент або як клас CSS. Посилання нижче відповідає офіційному Документація ngInclude.

атрибут Вимагається Що вона робить
src або ng-include Так Вираз, який обчислюється як шаблон URL
навантаження Немає Вираз обчислюється щоразу, коли завершується завантаження нової часткової оброблюваної сутності
автопрокручування Немає Викликає $anchorScroll після завантаження контенту; пропуск атрибута вимикає прокручування
<div ng-include="'Table.html'" onload="loaded = true" autoscroll></div>
<ng-include src="templateUrl"></ng-include>

Найпоширеніша помилка випливає з першого рядка: src приймає вираз, а не простий рядок. Тому буквальний шлях потребує власних лапок всередині атрибута, тому наведений вище приклад виглядає так: ng-include="'Table.html'"Письменство ng-include="Table.html" змушує AngularJS оцінювати Table як властивість області видимості, нічого не знайти та залишити елемент порожнім.

Чому ng-include створює нову дочірню область видимості

Директива не вставляє розмітку в навколишню область видимості. Кожне включення створює новий дочірній об'єкт. сфера що прототипно успадковується від області видимості, в якій його було оголошено, і цей один факт пояснює більшість несподіванок зв'язування.

Читання працює належним чином. Частково вищезгаданий код виглядає так: tutorial безпосередньо від батьків, тому ng-repeat знаходить масив. Запис відбувається саме там, де все переривається: коли часткове значення присвоюється примітиву, як у випадку ng-model="topic", AngularJS створює topic в дочірній області видимості, а батьківська копія ніколи не змінюється.

Дві звички допомагають уникнути цієї пастки:

  • Зв'язати через об'єкт, як у ng-model="data.topic", щоб батько та дитина досягли одного й того ж посилання.
  • Зберігайте стан у контролері або сервісі та надавайте функції замість голих примітивів.

Включення також випромінює $includeContentRequested, $includeContentLoaded та $includeContentError, щоб батьки могли відреагувати через $scope.$on не торкаючись взагалі дочірньої області видимості.

Як виправити порожній або невдалий ng-include

Включення, яке нічого не відображає, зазвичай не спрацьовує з однієї з кількох причин. Розгляньте їх у такому порядку.

  1. Перевірте цитати. Літеральне ім'я файлу потребує одинарних лапок всередині значення атрибута. Без них вираз приймає значення undefined, і запит ніколи не надсилається.
  2. Обслуговувати сторінку через HTTP. Директива видає XHR для часткового коду, тому відкриття Main.html безпосередньо з диска через адресу файлу не вдається у більшості браузерів. Будь-який локальний веб-сервер очищує це.
  3. Переконайтеся, що шлях вирішено. Слідкуйте за мережевою панеллю для запиту. Код 404 означає, що шлях вказано відносно сторінки, на якій розміщено включення, а не відносно часткового елемента, який на нього посилається.
  4. Дотримуйтесь правила однакового походження. За замовчуванням шаблон URL має збігатися з доменом та протоколом документа програми, оскільки AngularJS передає його через $sce.getTrustedResourceUrlШаблон з іншого джерела потребує запису в надійному ресурсі. URL список або явну обгортку trustAsResourceUrl, і віддалений сервер все одно має надсилати заголовки CORS.
  5. Прислухайтеся до невдачі. $includeContentError спрацьовує щоразу, коли статус відповіді виходить за межі від 200 до 299, перетворюючи мовчазно порожню область на повідомлення, яке варто записати в журнал.

Ще одну причину легко пропустити. AngularJS зберігає кожен отриманий фрагмент у $templateCache, тому відредагований файл може продовжувати обслуговувати застарілу розмітку, доки запис кешу не буде видалено або сторінка не буде перезавантажена з вихідного коду. Коли фрагмент потребує власної поведінки, а не лише розмітки, користувацька директива з власним шаблоном та ізольованою областю застосування є кращим інструментом.

Поширені запитання

ng-include вставляє фрагмент, який ви самі називаєте, будь-де на сторінці. ng-view відтворює будь-який шаблон, який маршрутизатор відображає поточну URL, і лише один ng-view належить до макета.

Ні. Частковий фрагмент містить лише фрагмент. Перенесенняping у html, тегах head або body залишає залишки елементів, оскільки розмітка вставляється як дочірні вузли хост-елементу, а не обробляється як документ.

Ні. Фрагмент компілюється та вставляється як вузли DOM, тому вбудовані елементи скриптів ніколи не виконуються. Завантажте спільні скрипти зі сторінки хоста або перемістіть поведінку в контролер чи директиву.

Так. Із завантаженням ngAnimate директива запускає анімацію входу для вхідного фрагмента та анімацію виходу для вихідного, і обидві виконуються одночасно щоразу, коли змінюється вихідний вираз.

Так. Оскільки значення є виразом, вказівка ​​на властивість області видимості змінює фрагмент щоразу, коли ця властивість змінюється. Захищайте елемент за допомогою ng-if so, і нічого не завантажується, доки властивість не міститиме реальний шлях.

Еквівалента не існує. Розмітка багаторазового використання стає компонентом, а фрагмент, вибраний під час виконання, відтворюється через ngComponentOutlet або ngTemplateOutlet всередині ng-контейнера.

Мовні моделі зчитують застарілий набір шаблонів та групують часткові зміни, контролери та зв'язки в компоненти-кандидати, а потім пропонують порядок міграції. Розглядайте результат як перший черновик, оскільки успадкування області видимості рідко чітко відображається на вхідні дані компонента.

Копілот GitHub Режим агента перетворює частковий компонент на окремий компонент із типізованими вхідними даними та переписує шаблон хоста, але згенеровані прив'язки та тести все ще потребують перевірки людиною.

Підсумуйте цей пост за допомогою: