offline version v3
Запись на курсы по HTML, CSS, JavaScript, PHP, фреймворкам и CMS,
а также: помощь в поиске работы и заказов, стажировка на реальных проектах→
menu

Pure и impure каналы в Angular

Все каналы в Angular бывают двух типов: pure и impure. Pure каналы не допускают внесения изменений. Они принимают изменения в значениях типов String, Number, Boolean, Symbol. А вот в объектах типов Date, Array, Function, Object изменения происходят, только когда меняется сама ссылка на объект. Если, например, мы добавили элемент к массиву в классе компонента, то при форматировании он останется исходным. Изменения будут отображаться, если по-новому перезаписать массив. По умолчанию все каналы относятся к типу pure.

Impure каналы допускают изменения в объектах всех типов. Однако при этом снижается производительность работы фреймворка, т.к. он затрачивает больше ресурсов на форматирование объектов.

Давайте рассмотрим наш канал JoinPipe. Он работает с массивами и по умолчанию не может отслеживать в них изменения. Давайте сделаем его impure. Для этого в декоратор @Pipe добавим свойство pure в значении false:

import { Pipe, PipeTransform } from '@angular/core'; @Pipe({ name: 'join', pure: false }) export class JoinPipe implements PipeTransform { transform(array: string[], start?: any, end?: any): any { let result = array; if (start !== undefined) { if (end !== undefined) { result = array.slice(start, end); } else { result = array.slice(start, result.length); } } return result.join(', '); } }

Теперь в файле темплейта сделаем инпут для ввода нового имени в массив и привяжем к нему переменную #user. По клику на кнопку значение данной переменной будет добавляться в общий массив с именами. Далее каждое отформатированное имя отобразиться под кнопкой:

<input #user name="user"> <button class="btn" (click)="users.push(user.value)">Add</button> <p>{{ users | join }}</p>

В главном компоненте проекта создайте массив с городами. Сделайте так, чтобы через инпут можно было добавить новый город в массив.

Измените код из предыдущего примера так, чтобы названия всех городов выводились в абзацах в верхнем регистре.