Template binding
Функциональность
Data binding automatically keeps your page up-to-date based on your application's state. You use data binding to specify things such as the source of an image, the state of a button, or data for a particular user.
Как оно работает
Почему здесь перфоманс важен
Чем быстрее пользователь увидит новые данные, тем лучше
Примеры плохого кода
Вызов методов из темплейт
Создание конфиг объектов на темплейтах
Использование геттеров для темплейт, так как они прячут поведение и вызываются на каждом тике
Примеры хорошего кода
Использование пайп для форматирования данных
Использование OnChanges хука если данные изменяются на инпут параметрах
Можем ли мы писать проект без этого
Технически да, но это базовая фича избавление от которой ставит под сомнение использование ангуляра в целом
Подводные камни
Темплейты компилятся в джаваскрипт и их не существует при билде в prod окружении
Это настоящий живой DOM, соответственно все изменения в темплейтах (как это можно назвать) отображаются в доме сразу после чейндж детекшна
Есть вероятность увидеть байндинги с неопределенными значениями
Ангуляр не может проверить глубоковложенные изменения объектов, переданные по ссылке
Ангуляр не может увидеть изменения произошедшие внутри компонент (все что не детектится зоной)
Что влияет на перформанс в этой фиче?
Байндинги проверяются на изменения при каждом cdr.run, поэтому на перформанс влияет все что может обновляться при этом.
Каждый тик для каждого из байндингов в аттрибутах, хост-проперти, интернализации, проперти, стилях вызывает проверку обновился ли байндинг
export function bindingUpdated(lView: LView, bindingIndex: number, value: any): boolean {
const oldValue = lView[bindingIndex];
if (Object.is(oldValue, value)) {
return false;
} else {
lView[bindingIndex] = value;
return true;
}
}
Обновление байндингов синхронное и соостветственно при вызове функций из темплейт могут получится рендер лаги
Как можно избавиться от негативного влияния на перформанс
Использовать пайпы
Не вызывать методы напрямую из темплейт
Не создавать объекты
Чего не хватает в базовой функциональности
Определение изменилось ли что-то в объекте без нужды в вызове ngDoCheck каждый раз
Константных интерполяций, которые не будут проверяться на каждом тике
Темплейты не видят импортов, поэтому для всяких разных импортируемых массивов/энамов надо заводить переменную в компоненте
Что кажется избыточным в базовой функциональности
Возможность вызова методов для инпут-байндингов. Практиески все линтеры говорят нам, что это плохой код и практики, но тем не менее без этой возможности ангуляр бы планку входа поднял бы еще выше
Last updated