Ответ 1
Если вы хотите переосмыслить проблему, вы можете использовать оператор Rxjs scan:
- Если не существует предыдущего ApplicationState, примите первый. Перевести его в TreeNodes рекурсивно. Поскольку это фактический объект, rxjs не участвует.
- При получении нового состояния приложения, то есть при сканировании, реализуйте функцию, которая мутирует предыдущие узлы с использованием принятого состояния и возвращает предыдущие узлы в операторе сканирования. Это гарантирует вам ссылочную целостность.
- Теперь у вас может возникнуть новая проблема, так как изменения в мутировавших узлах дерева могут быть недоступны. Если да, просмотрите дорожку путем создания подписи для каждого node или рассмотрите возможность добавления changeDetectorRef в node (предоставляется при помощи рендеринга компонента node), что позволяет отмечать компонент для обновления. Это, скорее всего, будет работать лучше, поскольку вы можете пойти с изменить стратегию обнаружения OnPush.
псевдокод:
state$.scan((state, nodes) => nodes ? mutateNodesBy(nodes, state) : stateToNodes(state))
Выход гарантированно сохраняет ссылочную целостность (где это возможно), поскольку узлы строятся один раз, а затем только мутируются.