Я сделал behaviour subject, который хранит высоту контента. В afterviewchacked обновляю высоту. Также в afterviewinit подписываюсь на то, когда новый ajax запрос происходит и добавляются новые элементы. После с помощью пайпа pairwarse получаю прошлое значение высоты и нынешнее и считаю дельту изменения. Ее я устанавливаю в качестве скрола. Ситуацию облегчает то, что не нужно учитывать скрол, до того как новые сообщения добавились, так как они добавляются по достижению верхней границы (scrolltop равняется нулю). Думаю легче скинуть код, чем все тут расписывать. Если хотите могу кинут гитхаб.
понял смысл, я примерно это и предлагал) но как-то странно, что сообщения запрашиваются, когда scrolltop=0, потому что обычно делается запас для того, чтобы пользователь мог дальше скроллить, пока данные грузятся