You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kendo Editor的ImageBrowser是否支持添加分页或懒加载功能

Kendo Editor ImageBrowser 分页/懒加载实现方案

默认的ImageBrowser组件设计是一次性拉取路径下全部FileBrowserEntry数据,没有内置分页/懒加载逻辑,加载数千张图片时的卡顿来自全量接口请求+一次性渲染DOM的双重开销,可通过以下两种方案实现单页加载20张、按需拉取剩余内容,不需要修改组件源码。

方案1:滚动懒加载(推荐,用户无额外操作成本)

  • 第一步:改造后端读取接口
    原接口不要直接返回全量List<FileBrowserEntry>,新增两个分页入参:page(页码,从1开始计数)、pageSize(固定传20),返回结构调整为带总条数的分页对象:
    public class PagedImageResult
    {
        // 符合筛选条件的图片总条数
        public long Total { get; set; }
        // 当前页的图片数据,结构和原来的FileBrowserEntry完全一致
        public List<FileBrowserEntry> Data { get; set; }
    }
    
    接口内部逻辑加分页截取:
    var pagedData = allImageEntries
        .Skip((page - 1) * pageSize)
        .Take(pageSize)
        .ToList();
    return Json(new PagedImageResult { Total = totalCount, Data = pagedData });
    
  • 第二步:前端重写传输逻辑+绑定滚动监听
    初始化Editor时重写ImageBrowser的read方法,拦截默认全量拉取逻辑,同时在弹窗渲染完成后给图片列表容器绑定滚动事件,滚到底部自动拉取下一页:
    $("#editor").kendoEditor({
        imageBrowser: {
            transport: {
                read: function(options) {
                    const targetPage = options.data.page || 1;
                    const pageSize = 20;
                    $.get("/api/your-image-read-endpoint", {
                        path: options.data.path || "/", // 保留原有文件夹路径参数
                        page: targetPage,
                        pageSize: pageSize
                    }, function(res) {
                        // 缓存总条数、当前页码到组件实例,供滚动判断用
                        const imageBrowser = $("#editor").data("kendoEditor").imageBrowser;
                        imageBrowser._totalCount = res.Total;
                        imageBrowser._currentPage = targetPage;
                        options.success(res.Data);
                    });
                }
            },
            // 弹窗打开后绑定滚动监听
            init: function(e) {
                const imageBrowser = e.sender;
                imageBrowser.popup.bind("activate", function() {
                    const listContainer = imageBrowser.popup.element.find(".k-tiles");
                    // 先解绑旧事件,避免重复绑定
                    listContainer.off("scroll.lazy").on("scroll.lazy", function() {
                        const loadedCount = imageBrowser._currentPage * 20;
                        // 滚动到距底部50px阈值、且还有未加载数据时触发加载
                        if (this.scrollTop + this.clientHeight >= this.scrollHeight - 50 
                            && loadedCount < imageBrowser._totalCount) {
                            imageBrowser.dataSource.read({
                                page: imageBrowser._currentPage + 1,
                                path: imageBrowser.path()
                            }).then(function(newItems) {
                                // 追加新数据到现有列表,不要直接替换
                                imageBrowser.dataSource.addRange(newItems);
                            });
                        }
                    });
                });
                // 切换文件夹时重置分页状态,避免不同文件夹数据混淆
                imageBrowser.listView.bind("dataBinding", function() {
                    if (imageBrowser.path() !== imageBrowser._lastPath) {
                        imageBrowser._currentPage = 1;
                        imageBrowser._lastPath = imageBrowser.path();
                    }
                });
            }
        }
    });
    

踩坑提示:不要直接给ImageBrowser的内置dataSource设置serverPaging: true,默认逻辑翻页时会清空当前页已渲染内容,不会做数据追加,会导致用户看不到之前加载的图片。

方案2:显式分页控件

如果需要明确的分页按钮而非滚动触发,可在ImageBrowser弹窗底部挂载Kendo原生Pager组件:

  • 后端接口和方案1保持一致,支持分页参数
  • 在弹窗activate事件中,获取ImageBrowser内部的listView数据源,开启服务端分页,设置pageSize: 20,再把弹窗底部的空白区域初始化为kendoPager,绑定同一个数据源即可,组件会自动处理分页请求、页码切换逻辑,不需要手写滚动判断。
  • 如果是2020年之前的旧版本Kendo UI,需要通过imageBrowser._listView.dataSource获取内部数据源,不要自行新建数据源,否则会和组件内置逻辑冲突。

原接口返回结构参考:
返回结构示例截图

内容的提问来源于stack exchange,提问作者Trusha Savsani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 08:57:20