Я упомянул ее в статье. Работал с ngrx достаточно долго, правда давно, возможно там что-то принципиально изменилось. После нее долго работал с ngxs. И считаю что для ангуляра они просто поворот не туда. Из самых очевидных минусов — огромное количество ненужного бойлерплейта, в коде сложно понять где будет обработан экшен, как и где обрабатывать ошибки. Невозможность переиспользования стейта наследованием — нужны будут уже другие экшены которые заодно придется заново описать. Более того просто нет возможности использовать преимущества иерархии инжекторов для переиспользования кода. Не вижу ни одной причины чем это лучше прямого вызова функции у сервиса, как я предлагаю. Ngxs кстати, пытались сделать подобный костыль, который достаточно криво работал. akita же из коробки предлагает нормальный подход, и кстати работает с ReduxDevtools.
Все же ViewModel в оригинале предполагает связывание данных, которое в ангуляре я не использую. Мой подход совпадает скорее, например, с паттерном Presentation Model отсюда
В статье я попытался описать его достаточно подробно, чтобы не пришлось ссылаться на другие паттерны.
Верно, контроллер при этом может работать опять же с абстрактными данными. Во многих случаях такой подход позволит сэкономить некоторое количество кода или избежать создания новых компонентов.
Вообще говоря, это я и предлагаю делать — выделять и наследовать сервисы. Манипуляции с подменой зависимостей обычно помогают избегать создания лишних компонентов с сервисами и написания повторяющегося кода. Например, подмена контроллера может заменить передачу десятка Input Output параметров через несколько уровней вложенности на одну строку с провайдером. Разумеется, использовать техники стоит только в случаях когда они приносят конкретный профит.
В статье я попытался описать его достаточно подробно, чтобы не пришлось ссылаться на другие паттерны.