У меня есть родительский компонент, который отображает список дочерних компонентов, используя ngFor
. Я заметил, что производительность становится очень плохой с увеличением числа детей, поэтому я изменил оба на OnPush
стратегии обнаружения изменений.Угловое обнаружение изменения OnPush и ngFor
Это очень помогло, но сценарий по-прежнему остается небольшим, и я вижу, что это связано с тем, что для каждого из детей без необходимости выполнялось обнаружение изменений.
Одним из примеров является событие щелчка внутри дочернего компонента - даже если входы не изменены и его просто запускает анимацию, по какой-либо причине обнаружение изменений выполняется для родительского компонента и в результате для каждого дочернего элемента (хотя модель за ngFor
не меняется вообще и ее стратегия OnPush
...). Я бы подумал, что такое «изолированное» событие должно только инициировать обнаружение изменений в этом конкретном дочернем компоненте, а не распространяться (я действительно пробовал event.stopPropagation()
и event.preventDefault()
без каких-либо успехов).
Так мне было интересно, две вещи:
1) есть ли способ иметь больше контроля за то, что события могут изменить определение на самом деле работает, и это вызывает родительское изменения компонента detecion а ли?
2) использует «переводить» трубы довольно много в каждом дочернем компоненте (из ng2translate), что может замедлить обнаружение приложения/изменения?
Образец plunkr, чтобы показать, в чем проблема. В основном, если я нажимаю на любой элемент в списке ngFor, он запускает обнаружение изменений для каждого отдельного ребенка, а не только для затронутого, и мне было интересно, есть ли способ подавить это.
https://plnkr.co/edit/mD8HCbwq0cEwPt7itpCf
Спасибо. Я обновил свой вопрос с помощью plunkr, чтобы лучше продемонстрировать проблему. Но в принципе нет способа «подавить» обнаружение изменений в браке, и мне нужно было бы полностью отключить обнаружение изменений и обработать его самостоятельно? – Zyga
@ Zyga Я думаю, что в ваших дочерних компонентах не обнаружено изменений. Поместите console.log внутри метода 'isVisible'. Он будет ссылаться только на ваш клик. https://plnkr.co/edit/v514QJfNYXe13KKh23L2?p=preview 'ngDoCheck' работает для всех детей. Если вы удалите 'OnPush', тогда все ваши дети будут проверены. – yurzui
@Zyga Угловые метки' OnPush', как проверено после первого цикла обнаружения изменений, а затем они будут опущены. Http://take.ms/ZYOfB – yurzui