javascript - 在 knockout 中实现无限滚动的正确方法是什么?

标签 javascript knockout.js infinite-scroll

我的模型中有一系列文章,它们可以很好地呈现为 HTML。我想要的是在用户滚动到页面末尾时添加一些新文章。我做到了这一点,但在我看来有一些非常骇人听闻的行为:我所做的只是添加了 jquery 事件处理程序 $(window).scroll,如下所示:

function ArticlesViewModel() {
    var self                = this;
    this.listOfReports      = ko.observableArray([]);

    this.loadReports = function() {
        $.get('/router.php', {type: 'getReports'}, function(data){
            self.listOfReports(self.listOfReports().concat(data));
        }, 'json');
    };

    this.loadReports();

    $(window).scroll(function() {
        if($(window).scrollTop() == $(document).height() - $(window).height()) {
            self.loadReports();
        }
    })
};

在我的简单原型(prototype)场景中它工作得很好,但我认为即使我隐藏我的模型也会调用此滚动。

那么有没有更合适的方式来做同样的行为呢?

最佳答案

因为没有人回答我的问题,但 Jeroen 给了我在哪里看的提示,我将尝试用我找到的内容来回答我的问题。所以:

1) 你必须使用滚动事件

查看

<div id="main" data-bind="foreach: items, event: { scroll: scrolled }">
    <div data-bind="text: name"></div>
</div>

View 模型

var viewModel = {
    items: ko.observableArray([]),
    scrolled: function(data, event) {
        var elem = event.target;
        if (elem.scrollTop > (elem.scrollHeight - elem.offsetHeight - 200)) {
            getItems(20);
        }
    },
    maxId: 0,
    pendingRequest: ko.observable(false)
};

function getItems(cnt) {
    if (!viewModel.pendingRequest()) {
        var entries = [];
        for (var i = 0; i < cnt; i++) {
            var id = viewModel.maxId++;
            entries.push({
                id: id,
                name: "Name" + id
            });
        }
        viewModel.pendingRequest(true);
        $.ajax({
            type: 'POST',
            url: '/echo/json/',
            data: {json: ko.toJSON(entries), delay: .1},
            success: function(entries) {
                ko.utils.arrayForEach(entries, function(entry) {
                    viewModel.items.push(entry);
                });
                viewModel.pendingRequest(false);
            },
            error: function() {
                viewModel.pendingRequest(false);
            },
            dataType: 'json'
        });
    }
}
ko.applyBindings(viewModel);
getItems(20);

取自here和类似的方法 scrollOptions here .

还有一个不错的MIT-license implementation here .

关于javascript - 在 knockout 中实现无限滚动的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21932373/

相关文章:

javascript - 从获取返回值更新 vuejs 警报组件

knockout.js - 在Slickgrid上使用基因 knockout 的正确方法是什么

jquery - 使用 ajax 内容重置无限滚动

javascript - 如何获取输入数字字段中的小数以注册其值?

javascript - JSON 数据转换为看起来像表格的 HTML 列表

javascript - jQuery scrollTop 函数先下降然后动画到顶部

knockout.js - PagerJs - page-href 在 href 路径中添加 undefined

javascript - 使用 ko.utils.arrayForEach 迭代一个 observableArray

javascript - 在现有网站中实现无限滚动

css - 按日期无限滚动排序