Комментарии 16
Что-то эти анимации с выводом 8 чисел не впечатляют. Реализовали бы хотя бы такую штуку: https://mathieuancelin.github.io/js-repaint-perfs/mol/index.html
Reflect.set(target, propertyKey, true)
А чем это отличается от target[propertyKey] = true
? Автор этим хотел явно указать на то, что target есть объект сторонний и мутный? Или есть какое-то функциональное отличие?
target[propertyKey] = true
, вы затрёте оригинальное свойство. Из примера:export class Component { @observed() state = { name: '' };
Здесь target — Component, propertyKey — «state».
В противоположность этому Reflect хранит данные отдельно. Не обязательно использовать для этого Reflect, можно было бы например засунуть Map в скрытое свойство наподобие
ctx[subscriptionsSymbol]
.из соображений эффективности, пользоваться функцией ɵdetectChanges не стоит
вместо неё рекомендуется использовать функцию ɵmarkDirty.
Проблема в том, что markDirty()
помечает "грязной" всю вышестоящую ветку дерева начиная с корня и заканчивая нашим компонентом. Даже если промежуточные компоненты в этой ветке используют OnPush, они все равно будут отрендерены заново.
В то время, как detectChanges()
инициирует проверку изменений вниз от нашего компонента. При этом OnPush в нижестоящих компонентах правильно обрабатывается, и такие компоненты не рендерятся лишний раз.
Буду рад, если кто-то сможет пояснить, почему при этом markDirty()
является рекомендуемым подходом (а он-таки является, судя по этому комментарию к функции detectChanges()
)
А текущем Ангуляре ChangeDetectorRef надо внедрять через конструктор компонента. Это не бы не позволило реализовать декоратор @observed
— который в приведенной реализации импортирует markDirty
напрямую из Ангуляра
Angular без zone.js: максимум производительности