Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is the correct way to implement infinite scroll in knockout?

I have an array of articles in my Model and they are rendered nicely as HTML. What I want is to add some new articles when the user scrolls to the end of the page. I achieved this, but in my opinion with some really hacky behavior: all I have done is added jquery event handler $(window).scroll, like this:

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

In my simple prototype scenario it works nicely, but I think that this scroll will be called even if I will hide my model.

So is there a more appropriate way to do the same behavior?

like image 638
Salvador Dali Avatar asked Feb 21 '14 10:02

Salvador Dali


People also ask

How is infinite scroll implemented?

Infinite scrolling will require two key parts. One part will be a check for the window scroll position and the height of the window to determine if a user has reached the bottom of the page. Another part will be handling the request for additional information to display.

What is infinite scroll enabled?

Infinite Scroll is a feature that loads the next set of posts automatically when visitors approach the bottom of the home page or posts page. It's designed to help visitors read through many posts without effort.

What is infinite scroll page?

Infinite scrolling is a listing-page design approach which loads content continuously as the user scrolls down. It eliminates the need for pagination — breaking content up into multiple pages.

How does Javascript infinite scroll work?

Infinite scrolling is a feature that allows you to load some pics on a website and then load more once the user reaches the end of the webpage (like we see on Pinterest). We will start off by creating three files, index. html , style. css , and app.


2 Answers

Because no one has answered my question, but Jeroen gave me a hint where to look at, I will attempt to answer my question with what I have found. So:

1) You have to use scroll event

View

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

ViewModel

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

Was taken from here and similar approaches with scrollOptions here.

There is also a nice MIT-license implementation here.

like image 116
Salvador Dali Avatar answered Oct 26 '22 11:10

Salvador Dali


There is no "correct way", there are many different ways to implement infinite scroll in KnockoutJS, but I would suggest using the Knockout JS (KO) Infinite Scroll extender by thinkloop which you can find here: https://github.com/thinkloop/knockout-js-infinite-scroll

like image 26
System24 Tech Avatar answered Oct 26 '22 11:10

System24 Tech