В Angular 2 пока нет основных библиотек шаблонов пользовательского интерфейса, готовых для plug and play. Angular 2 Material Design находится в альфа-версии. Библиотека Bootstrap для Angular 2 также находится в разработке на Github, но не готова к использованию в прайм-тайм. Это означает, что создание пользовательского интерфейса для наших проектов Angular 2 в значительной степени предоставлено нашим собственным устройствам.

Давайте посмотрим, как запустить наш проект Angular 2 с помощью Bootstrap, но только с помощью таблиц стилей - без bootstrap.js или jQuery. Мы будем использовать Bootstrap 3, текущий стабильный выпуск, а не Bootstrap 4, на который нацелен проект
Angular 2 Bootstrap.

В этой статье мы создадим панель навигации Bootstrap как компонент Angular 2 и включим ее функцию переключения мобильного представления через класс компонента.

Мы пойдем по пути наименьшего сопротивления и просто заставим меню показывать и скрывать. В этом уроке мы откажемся от анимации перехода.

Для начала создайте NavbarComponent. Я поместил свой в CoreModule моего приложения Angular 2. Чтобы узнать больше об используемой мной модульной архитектуре, прочтите эту статью.

Начнем с голой панели навигации Bootstrap. Классы .collapse css еще не добавлены в html.

<!-- core/navbar.component.html -->
<nav class="navbar navbar-inverse navbar-fixed-top">
    <div class="container-fluid">
        <div class="navbar-header">
            <a class="navbar-brand">Project Manager</a>
        </div>
        <ul class="nav navbar-nav">
            <li><a>Link 1</a></li>
            <li><a>Link 2</a></li>
        </ul>
    </div>
</nav>

Файл TypeScript содержит следующее.

// core/navbar.component.ts
import { Component } from '@angular/core';
@Component({
    selector: 'ct-navbar',
    templateUrl: 'app/core/navbar.component.html'
})
export class NavbarComponent { }

Добавьте панель навигации в шаблон AppComponent.

<!-- /app.component.html -->
<!-- navbar -->
<ct-navbar></ct-navbar>
<!-- feature content -->
<ct-project-center></ct-project-center>

Запустите приложение, и панель навигации отобразит следующее.

Обратите внимание, что bootstrap.css обрабатывает отображение мобильной панели навигации для нас с помощью медиа-запроса - @media(min-width: 768px){...}

Чтобы наша навигационная панель свернулась, мы добавляем еще немного разметки в наш шаблон, используя Документацию Bootstrap в качестве руководства.

<nav class="navbar navbar-inverse navbar-fixed-top">
    <div class="container-fluid">
        <div class="navbar-header">
            <button type="button" class="navbar-toggle collapsed">
                <span class="sr-only">Toggle navigation</span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
            </button> <!-- #1 -->
            <a class="navbar-brand">Project Manager</a>
        </div>
         <div class="collapse navbar-collapse"> 
            <ul class="nav navbar-nav">
                <li><a>Link 1</a></li>
                <li><a>Link 2</a></li>
            </ul>
        </div> <!-- #2 -->
    </div>
</nav>
  1. Добавьте ‹button› с классами navbar-toggle и свернутыми. Он отображается, когда ширина области просмотра браузера меньше 768 пикселей.
  2. Оберните элемент ‹ul› в ‹div› классами collapse и navbar-collapse. Это приведет к тому, что элементы управления в списке ‹ul› больше не будут отображаться в мобильном представлении.

Попробуйте добавить класс in в ‹div›.

<div class="collapse navbar-collapse in">

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

Чтобы меню работало, нам нужно, чтобы Angular переключал этот класс за нас.

NgClass

Angular предоставляет директиву NgClass как средство для добавления и удаления классов из элементов html. Он принимает в качестве аргумента три разных типа ввода:

  • строка - введите строку в ngClass, чтобы добавить один или несколько классов. Несколько классов разделяются пробелом. например [ngClass]="'first second'"
  • Массив - введите массив, содержащий строковые значения классов, которые вы хотите добавить.
  • Объект. Введите объект, в котором свойство объекта представляет класс. Для свойства установлено логическое значение, указывающее, следует ли добавить класс к элементу html.

NgClass является частью CommonModule, который, скорее всего, уже был импортирован в модуль, над которым вы работаете.

Мы применим директиву NgClass к нашему шаблону, введя объект в качестве аргумента.

<!-- core/navbar.component.html -->
...
<div class="collapse navbar-collapse"
     [ngClass]="{ 'in': true }">
     <ul class="nav navbar-nav">
           <li><a>Link 1</a></li>
           <li><a>Link 2</a></li>
     </ul>
</div>
...

Мы жестко запрограммировали значение true, чтобы получить представление о синтаксисе и убедиться, что он работает. Запустите приложение и убедитесь, что панель навигации открыта с размером экрана мобильного
.

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

// core/navbar.component.ts
...
export class NavbarComponent {
    isIn = false;   // store state
    toggleState() { // click handler
        let bool = this.isIn;
        this.isIn = bool === false ? true : false; 
    }
}

Теперь мы используем эти свойства компонентов в нашем шаблоне.

<!-- core/navbar.component.html -->
<nav class="navbar navbar-inverse navbar-fixed-top">
    <div class="container-fluid">
        <div class="navbar-header">
                <button type="button" 
                        class="navbar-toggle collapsed"
                        (click)="toggleState()">
                <span class="sr-only">Toggle navigation</span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
            </button>
            <a class="navbar-brand">Project Manager</a>
        </div>
         <div class="collapse navbar-collapse"
              [ngClass]="{ 'in': isIn }">
            <ul class="nav navbar-nav">
                <li><a>Link 1</a></li>
                <li><a>Link 2</a></li>
            </ul>
        </div>
    </div>
</nav>

Вот и все. Теперь у нас есть функциональная панель навигации.

Этот же метод можно применить для использования многих компонентов Bootstrap в вашем проекте Angular 2, включая раскрывающиеся меню и складные панели в стиле аккордеона.