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);