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

⚡ Умное резюме

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

  • 🔘 Директивная роль: ng-include извлекает внешний фрагмент и вставляет его в качестве дочернего узла к элементу-хозяину.
  • ☑️ Указанный путь: Значение src представляет собой выражение, поэтому для указания имени файла в виде текста необходимо заключить его в одинарные кавычки.
  • Реализованный пример: Файл Table.html отображается с помощью ng-repeat после того, как файл Main.html внедрит его в div контроллера.
  • 🧪 Новая дочерняя область видимости: Каждый оператор include создает дочернюю область видимости, поэтому для привязки примитивных типов данных требуется точечная нотация.
  • 🇧🇷 В число пустых полей входят: Правила одинакового источника, переменная $sce и доступ к файлу объясняют большинство пустых результатов.
  • 📊 Примечание к версии: Поддержка AngularJS прекратилась в январе 2022 года; современный Angular использует компонентную компоновку.

Директива ng-include в AngularJS внедряет внешний HTML-файл в основной шаблон.

По умолчанию HTML не предоставляет возможности включать клиентский код из других файлов. Обычно в любом языке программирования хорошей практикой является распределение функциональных возможностей по различным файлам для любого приложения.

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

Обычно это концепция Включить утверждения которые доступны в языки программирования например, .Net и Java.

В этом руководстве рассматриваются другие способы работы с файлами (файлами, содержащими внешние файлы). HTML код) можно включить в основной HTML-файл.

Включает в себя: Включает в себя:

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

Ниже описаны шаги, которые можно выполнить для достижения этой цели.

Шаг 1) Определите файл с именем Sub.html и добавьте в него следующий код.

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

Шаг 2) Создайте файл Sample.html, который является основным файлом вашего приложения, и добавьте приведенный ниже фрагмент кода.

Ниже приведены основные аспекты приведенного ниже кода, на которые следует обратить внимание.

  1. В теге body есть тег div с идентификатором Content. Это место, куда будет вставлен код из внешнего файла 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.

Как включить 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». Затем он использует нг-повторить директива, которая проходит по каждой теме в переменной «tutorial» и отображает значения для «Name» и «Description' пара ключ-значение.

<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 создается переменная типа «tutorial». Эта переменная содержит список пар ключ-значение.

В нашем примере пары ключ-значение:

  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>

Когда вы выполните приведенный выше код, вы получите следующий результат.

Результат:

На скриншоте ниже показан результат рендеринга: вкладка браузера отображает заголовок «Регистрация на мероприятие», заголовок расположен над внедренной таблицей, а три строки берутся из массива tutorial в файле 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. Проверьте цитаты. Для указания имени файла в значении атрибута необходимо использовать одинарные кавычки. Без них выражение будет считаться неопределенным, и запрос не будет отправлен.
  2. Отправлять страницу по протоколу HTTP. Директива отправляет XHR-запрос для частичного файла, поэтому открытие файла Main.html напрямую с диска по его адресу не удается в большинстве браузеров. Любой локальный веб-сервер устраняет эту проблему.
  3. Убедитесь, что путь распознан. Следите за панелью «Сеть» для получения информации о запросе. Ошибка 404 означает, что путь является относительным к странице, на которой размещен включаемый файл, а не к частичному шаблону, который на него ссылается.
  4. Соблюдайте правило одинакового происхождения. По умолчанию шаблон URL Должно соответствовать домену и протоколу документа приложения, поскольку AngularJS передает их дальше. $sce.getTrustedResourceUrlШаблон, взятый из другого источника, должен быть внесен в список доверенных ресурсов. URL Если используется список или явная обертка trustAsResourceUrl, удаленный сервер все равно должен будет отправлять заголовки CORS.
  5. Прислушивайтесь к неудачам. Ошибка $includeContentError возникает всякий раз, когда статус ответа выходит за пределы диапазона от 200 до 299, превращая незаметную пустую область в сообщение, заслуживающее внимания.

Ещё одна причина, которую легко упустить из виду. AngularJS хранит каждый загруженный частичный шаблон в $templateCache, поэтому отредактированный файл может продолжать отображать устаревшую разметку до тех пор, пока запись в кэше не будет удалена или страница не будет перезагружена из исходного кода. Когда фрагменту требуется собственное поведение, а не только разметка, пользовательская директива Инструмент с собственным шаблоном и изолированной областью применения является более предпочтительным.

Часто задаваемые вопросы (FAQ)

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

Нет. Частичный объект содержит только фрагмент. Оберткаping Использование тегов <head> или <body> в HTML приводит к появлению лишних элементов, поскольку разметка вставляется как дочерние узлы основного элемента, а не обрабатывается как единый документ.

Нет. Фрагмент компилируется и вставляется как DOM-узлы, поэтому встроенные скриптовые элементы никогда не выполняются. Загружайте общие скрипты со страницы-хоста или перенесите это поведение в контроллер или директиву.

Да. При загруженном ngAnimate директива запускает анимацию входа для входящего фрагмента и анимацию выхода для исходящего, и обе анимации выполняются одновременно всякий раз, когда изменяется исходное выражение.

Да. Поскольку значение является выражением, указание на свойство области видимости приводит к замене фрагмента всякий раз, когда это свойство изменяется. Защитите элемент с помощью ng-if, чтобы ничего не загружалось, пока свойство не будет содержать реальный путь.

Аналогов не существует. Многократно используемая разметка становится компонентом, и фрагмент, выбранный во время выполнения, отображается через него. ngComponentOutlet или ngTemplateOutlet внутри ng-container.

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

Второй пилот GitHub В режиме агента частичный шаблон преобразуется в автономный компонент с типизированными входными данными, а основной шаблон перезаписывается, однако сгенерированные привязки и тесты по-прежнему требуют проверки человеком.

Подведем итог этой публикации следующим образом: