我正在尝试在 KnockoutJS 中找到一种滚动到列表项(或任何相关内容)的方法。
我所拥有的只是列表中的一个对象/ID,我希望滚动到该列表。
我已经将我试图在下面实现的功能(和简化)版本放在一起。
演示:http: //jsfiddle.net/qczdvkat/
JavaScript:
function ViewModel()
{
var self = this;
self.items = ko.observableArray([]);
for(i = 0 ;i < 150; i++)
{
self.items.push({id: i, title: 'Item No. ' + i});
}
self.scrollToItem = function() {
console.log('Scrolling to item 125...');
$('ul').scrollTop($('ul [data-id="' + 125 + '"]').position().top - $('ul li:first').position().top);
};
}
$(function() {
ko.applyBindings(new ViewModel());
});
HTML:
<ul data-bind="foreach: items">
<li data-bind="text: title, attr: {'data-id': id}">
</li>
</ul>
<button data-bind="click: scrollToItem">Scroll to Item No. 125</button>
CSS:
ul
{
max-height: 150px;
overflow-y: scroll;
border: 1px solid #000;
}
虽然上述方法有效,但我正在寻找一种更清洁/更多 KnockoutJS并且不涉及我正在使用的 jQuery/data-* 属性的方法 - 因为它违反了 MVVM 原则。
我想问题的根源归结为:如何从渲染列表/树/等中的特定对象获取 DOM 元素?
虽然我在 StackOverflow 上找到了一些资源,但我所看到的都没有解决这个特定的问题。