Copied to clipboard

Flag this post as spam?

This post will be reported to the moderators as potential spam to be looked at


  • Kieron 152 posts 390 karma points
    Aug 31, 2018 @ 09:19
    Kieron
    0

    "Lazy Loading" Additional content on scroll, without refresh.

    Hi all

    Did a search on this subject and found various answers such as:

    https://our.umbraco.com/forum/umbraco-7/using-umbraco-7/75559-pulling-child-node-content-via-ajax-or-some-other-method

    https://our.umbraco.com/forum/templates-partial-views-and-macros/76046-umbraco-ajax-load-more-onclick-of-a-button-using-surfacecontroller

    But looking to see now if there is a different way anyone would do anything, to summarise:

    Got a site which has various types of content, X, Y, Z etc, and when you load up the page to view all the X's, it only gives you 6, then on scroll, you get the next 6 etc.

    Requirements being it should be fast & not refresh the page, so this rules out pagination & probably rules out loading all content then showing them 6 at a time, but I do not know.

    I am a beginner to Umbraco so believe I will need to use some sort of controller etc to solve this, though I only work within the web interface of Umbraco so hopefully, this doesn't limit the solution.

    Thanks

  • Richard Eyres 98 posts 580 karma points
    Aug 31, 2018 @ 13:37
    Richard Eyres
    1

    Hello

    Would an Umbraco API controller work for you? https://our.umbraco.com/Documentation/Reference/Routing/WebApi/

    You could create an AJAX request to the API call to get the information you require.

    I do not have any code for an infinite scroll facility, but i have used Umbraco API controller before to get information i require to the view.

  • Kieron 152 posts 390 karma points
    Aug 31, 2018 @ 13:39
    Kieron
    0

    Sounds like the right direction, ill need to find more of a "guide" as the documentation doesn't really contain any specific examples on what I need to do.

  • Comment author was deleted

    Aug 31, 2018 @ 13:52

    Yes definitely take a look at WEBAPI,

    Let's say X has property name, intro and url

    Step 1, define your model (/models/NewsItem.cs)

     public class NewsItem
        {
            public string Url { get; set; }
            public string Name { get; set; }
            public string Intro { get; set; }
    
        }
    

    Step 2: create (strongly typed) partial view (/views/partials/NewsItem.cshtml)

    @model YourProjectName.Models.NewsItem
    
    
    <div class="item">
        <a href="@Model.Url">
            <div class="text">
                <h3>
                    @Model.Name
                </h3>
    
            </div>
        </a>
    </div>
    
  • Comment author was deleted

    Aug 31, 2018 @ 13:53

    Oops got posted to quick, was still writing... part 2 coming up

  • Kieron 152 posts 390 karma points
    Aug 31, 2018 @ 13:56
    Kieron
    0

    Don't worry, I'm still trying to find the Models folder... lol.

    Thanks for your help though I'm excited to try :)

    Edit; is it app_data/Models?

  • Comment author was deleted

    Aug 31, 2018 @ 13:59

    nope it's just /Models (you might need to create it) on the same level as App_Data

  • Comment author was deleted

    Aug 31, 2018 @ 13:58

    Step 3, add another partial view that will list newsitems (not a single one but a collection (/views/partials/NewsItems.cshtml)

    @model IEnumerable<NewsItem>
    
    @if (Model.Any())
    {
    <div class="row">
        @foreach (var item in Model)
        {
            @Html.Partial("NieuwsItem", item)
    
        }
    </div>
    }
    

    Step 4: add a surface controller that will handle the rendering of more news items (/controllers/MoreNewsItemsController.cs)

     public class MoreNewsItemsController: SurfaceController
    {
        public ActionResult LoadMoreNewsItems(int pageId, int ItemsPerPage,  int page)
        {
          //fetch the news items here and cast them to the model
          var newsItems = ...;
          return PartialView("~/Views/Partials/NewsItems.cshtml", newsItems);
    
  • Comment author was deleted

    Aug 31, 2018 @ 14:03

    then on the page where you output the news, you'll first output n number of items and then lazy load the rest with js

    here is a snippet to get you started but you'll need to finetune it

     <script>
    
        var lazyloadPage = 2,
            lazyloadHtml = '';
    
        function lazyload() {
    
            var requestData = {
    
                pageId: @Model.Content.Id,
                itemsPerPage: 6,
                page: lazyloadPage
            }
    
            $.get('/umbraco/surface/MoreNewsItems/LoadMoreNewsItems', requestData, function (data) {
    
                var newData = data.trim();
    
                if (newData.length > 0) {
    
                    $('#search-load-more').css('display', 'inline-block');
    
                } else {
    
                    $('#search-load-more').css('display', 'none');
                }
    
                lazyloadHtml = newData;
            });
        }
    
        $('#search-load-more').click(function (event) {
    
            event.preventDefault();
    
            setTimeout(function () {
    
                $('#search-result-wrapper').append(lazyloadHtml).find('.load-more-step').removeClass('load-more-step').fadeIn(200);
                lazyloadPage++;
                lazyload(lazyloadPage);
            }, 0);
        });
    
        lazyload(lazyloadPage);
    
    
    
    
    </script>
    
  • Comment author was deleted

    Aug 31, 2018 @ 14:04

    Hope this makes sense :) you'll also need jQuery since that is used in the js....

    The snippet basicly lazy loads the next n items on page load and then when a button is clicked is shows them plus lazy loads the next items

  • Comment author was deleted

    Aug 31, 2018 @ 14:06

    I'll try to wrap this in a exampe project but currently you'll have to do it with this

  • Kieron 152 posts 390 karma points
    Aug 31, 2018 @ 14:08
    Kieron
    0

    Ive implemented everything and will have a good go at figuring it out! Thanks very much.

    edit; Im getting a 404 here;

       domain.co.uk/umbraco/surface/MoreNewsItems/LoadMoreNewsItems?pageId=1075&itemsPerPage=6&page=4 404 (Not Found)
    

    I must have something in the wrong place!

  • Kieron 152 posts 390 karma points
    Sep 03, 2018 @ 09:10
    Kieron
    0

    Hey Tim, ive been fiddling around with this all for a couple days now & unfortunately am no further ahead. I wondered if you might be able to load it into a working example, only if you have the time of course.

    Thanks in advance!

  • Comment author was deleted

    Sep 03, 2018 @ 09:16

    Will do but it won't be until tomorrow evening...

  • Kieron 152 posts 390 karma points
    Sep 03, 2018 @ 10:19
    Kieron
    0

    No rush at all!

  • Kieron 152 posts 390 karma points
    Sep 11, 2018 @ 13:32
    Kieron
    0

    Hey Tim, just wondering if you found the time to whip up that example for me. Thanks :-D

  • ibrahim TUNC 55 posts 133 karma points
    Mar 21, 2019 @ 21:15
    ibrahim TUNC
    0

    I think Tim forgot about it.

  • Matt Taylor 873 posts 2086 karma points
    Oct 12, 2020 @ 16:01
    Matt Taylor
    0

    I have the same requirement. Would be good to see a working example.

  • This forum is in read-only mode while we transition to the new forum.

    You can continue this topic on the new forum by tapping the "Continue discussion" link below.

Please Sign in or register to post replies