Как Ngrx запускает обнаружение изменений Angular в стратегии OnPush - PullRequest
0 голосов
/ 07 октября 2019

В стратегии Angular OnPush обнаружение изменений запускается только в том случае, если переменная @Input () изменяется на ref.

Однако при использовании Ngrx мы подписываемся на селекторы магазина, а стратегия Onular в Angular обнаруживает изменения. в этих подписках, даже если они не переданы во входные переменные.

Мой вопрос: как это работает? Как получается, что с помощью стратегии OnPush Angular обнаруживает изменения в хранилище Ngrx без прохождения их через входные переменные?

Я попытался найти ответ в API, затем попытался отсканировать код Ngrx в Github, но безуспешнодо сих пор. Если вы знаете, где лежит фрагмент кода Ngrx, за который я упускаю исходный код, вы бы сделали мой день.

1 Ответ

1 голос
/ 07 октября 2019

OnPush не выполняет поиск изменений в дереве объектов, если ссылка на объект не изменяется.

prop = { val: 1 };

и в шаблоне

{{ prop.val }}

Если вы используете OnPush

prop.val = 2;

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

Вам необходимо будет использовать

prop = { val: 2 };

Какредуктор в NgRx должен использовать чистые функции, которые не изменяют объекты, но создают новые экземпляры объектов, которые вы должны быть уверены в использовании обнаружения изменений OnPush.

Не идите по пути отравления вашего проекта сумасшествием, котороеложится на путь NgRx. Redux не входит в угловую экосистему. Изучите RxJs и как разрабатывать хорошо сконструированные сервисы с субъектами поведения, и вы также можете использовать OnPush, если ваши субъекты поведения испускают только новые объекты, а не мутирующие объекты. модель государственного управления. Я разговаривал с Майком Райаном из основной команды NgRx несколько недель назад, и мой вопрос был о том, что он думает об этом заблуждении и сколько новичков сразу его используют, его ответом было то, что чрезмерное использование - это то, что нужно командепо адресу.

...