Extensor de rolagem automática para knockout.js

Ao estender um objeto observableArray, podemos rolar automaticamente um elemento rolável até sua parte inferior quando esse array é atualizado (ou seja, um log de bate-papo). Se a barra de rolagem do usuário ainda não estiver na parte inferior desse elemento, saberemos que ele está navegando no texto e não devemos interrompê-lo.

ko.extenders.scrollFollow = function (target, selector) {
target
.subscribe(function (newval) {
var el = document.querySelector(selector);

// the scroll bar is all the way down, so we know they want to follow the text
if (el.scrollTop == el.scrollHeight - el.clientHeight) {
// have to push our code outside of this thread since the text hasn't updated yet
setTimeout
(function () { el.scrollTop = el.scrollHeight - el.clientHeight; }, 0);
}
});

return target;
};

Exemplo de uso:

var viewModel = {
someArray
: ko.observableArray().extend({ scrollFollow: '#some_element' })
};

ko
.applyBindings(viewModel);