Структурные директивы ngIf, ngFor, ngSwitch¶
Структурные директивы изменяют структуру DOM с помощью добавления или удаления html-элементов. Рассмотрим три структурных директивы: ngIf, ngSwitch и ngFor.
ngIf¶
Директива ngIf позволяет удалить или, наоборот, отобразить элемент при определенном условии. Например, определим следующий компонент:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | |
В зависимости от значения свойства condition будет отображаться либо первый, либо второй параграф.
Начиная с версии Angular 4.0 директива ngIf обогатилась новыми возможностями. В частности, мы можем задавать альтернативные выражения с помощью директивы ng-template. Так, предыдущий пример будет аналогичен следующему:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | |
Выражение *ngIf="condition;else unset" указывает, что если condition равно false, то срабатывает блок <ng-template #unset>.
Либо можно определить более изощренную логику. Так, изменим шаблон компонента следующим образом:
1 2 3 4 5 6 | |
В данном случае, если condition равно true, то отображается блок thenBlock, иначе отображается блок elseBlock.
ngFor¶
Директива ngFor позволяет перебрать в шаблоне элементы массива. Например:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | |
В качестве значения директива принимает значение перебора аля-foreach: let item of items. Каждый перебираемый элемент помещается в переменную item, которую мы можем вывести на страницу.
При переборе элементов нам доступен текущий индекс элемента через переменную index, которую мы также можем использовать. Например:
1 2 3 4 5 | |
Надо учитывать, что индексация идет с нуля, поэтому, чтобы в данном случае отсчет шел с единицы, к переменной i прибавляется единица.
Символ звездочки и синтаксический сахар¶
Можно заметить, что при использовании директив ngFor и ngIf перед ними ставится символ звездочка. По факту это не более чем синтаксический сахар, который упрощает применение директивы. Так, определение ngIf:
1 2 | |
по факту будет представлять следующий код:
1 2 3 4 5 6 | |
В итоге параграф и его текст перемещаются внутрь элемента <template>. Сама директива помещается в тег <template>, в котором применяется привязка свойства. Булевое значение привязанного свойство указывает, надо ли отображать соответствующий контент.
В итоге мы можем выбирать либо первый способ со звездочкой, который более компактный, либо второй способ с элементами template.
То же самое касается и директивы ngFor:
1 2 3 | |
Этот код будет эквивалентен следующему:
1 2 3 4 5 | |
ngSwitch¶
С помощью директивы ngSwitch можно встроить в шаблон конструкцию switch..case и в зависимости от ее результата выполнения выводить тот или иной блок. Например:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | |
Директива ngSwitch в качестве значения принимает некоторое выражение. В данном случае это свойство count. В элемент template помещается инструкция ngSwitchCase, которая сравнивает значение выражения из ngSwitch с другим выражением. Если оба выражения равны, то используется данный элемент template. Иначе выполнение переходит к следующим инструкциям ngSwitchCase. Если же ни одна из инструкций ngSwitchCase не была выполнена, то вызывается инструкция ngSwitchDefault.
