使用web listview实现无限滚动

时间:2012-12-13 22:45:50

标签: kendo-ui

我知道listview的网络版没有开箱即用的无限滚动功能,就像手机一样。我仍然需要在我的解决方案中实现这一点,我不确定从哪里开始。我拥有的所有想法都需要我再次实现所有数据。所以假设我有25行加载。你到达滚动点并且它加载了25个,我实现它的方式它会重新加载前25个并再加25个。这当然会越慢,你走的越多,所以这不是一个选择哈哈有没有成功做过这样的事情?有没有好的开源无限滚动解决方案?任何提示/信息/代码将不胜感激。

谢谢!

3 个答案:

答案 0 :(得分:0)

此功能在web中的kendo网格中可用(请参阅kendo网站中的虚拟滚动示例)。如何使用网格虚拟滚动和修改显示模板看起来像listview?

虚拟滚动网格的示例代码为:

 $("#yourList").kendoGrid({
        dataSource: {
            type: "json",                
            pageSize: 25,
            transport: {
                read: {
                    cache: false,
                    url: "controller/actionmethod",
                    type: "post",
                    contentType: "application/json; charset=utf-8",
                    dataType: "json"
                }
            }
        },

        height: 150,
        width: 50,
        pageable: true,
        //selectable: "multiple",
        scrollable: {
            virtual: true
        },

        columns: [ { field: "col1", title: "col1" }]

    });

答案 1 :(得分:0)

我最终想出了一个解决方案。使用网格进行虚拟滚动并不是我想要的。我抛弃了listview并使用了数据源和普通的剑道模板渲染。

以下是它的工作原理...我有一个父div用于我的数据。我将一个事件附加到我的数据源更改事件中,一旦读取了新的数据页,父div就会获得一个附加在其中的子div,其中将呈现新的数据页。到目前为止,这对我来说完美无缺。

所以我的DOM看起来像这样。

<div id="EndlesslyScrollabledata" >
    <div id="DataPage1">
       .....
   </div>
    <div id="DataPage2">
       .....
   </div>
</div>
<button> Load more data </button>

每次点击加载更多数据都会将数据源移动到下一页,附加下一个“DataPage”并使用附加的“DataPage”中的数据渲染模板。

答案 2 :(得分:0)

我找到了一个使用dataBinging事件来模拟此行为的解决方案:

MVC代码:

@(Html.Kendo().ListView<your.custom.Class>()
    .Name("searchResults")
    .TagName("div")
    .ClientTemplateId("tptSearchResult")
    .DataSource(source =>
    {
        source.Read(read =>
        {
            read.Action("Search", "ControllerName").Data("searchResults_AdditionalData");
        });


    })
)

你应该使用&#34; AdditionalData&#34;方法,如果您想向搜索服务发送搜索参数或其他内容。

Javascript代码:

function Search(page) {
    currentPage = page;
    if(page == 1) {
        searchResults = [];
    }

    $("#searchResults").data("kendoListView").dataSource.read();
}

function searchResults_AdditionalData(ev) {
    return {
        code: $("#txtSearchCode").val(),
        pageNumber: currentPage,
        pageSize: pageSize
    };
}

var currentPage = 1;
var pageSize = 20;
var searchResults = [];
$(document).ready(function () {

    $("#searchResults").data("kendoListView").bind("dataBinding", function(ev) {

        if(searchResults.length != (currentPage * pageSize)) {
            if(!!ev && !!ev.items && ev.items.length == pageSize) {
                $("#btnLoadMoreData").show();
            } else {
                $("#btnLoadMoreData").hide();
            }

            searchResults = $.merge(searchResults, ev.items);
            this.dataSource.data(searchResults);
            this.dataSource.sync();
        }

    });
});

只剩下一件事:在同步后滚动到列表中第一个添加的元素。