LayUI删除数据,重载后出现数据接口异常时的解决方案

本文介绍在使用LayUI进行数据删除操作后,如何正确重载数据以避免接口异常,包括JS与Java代码实现,及异常原因分析。

LayUI删除数据,重载后出现数据接口异常时的解决方案

js代码

table.on('tool(demo)', function (obj) {
            // data为当前要删除的对象
            var data = obj.data;
            if (obj.event === 'detail') {
                //icon是图标,6是图标编号,默认没有
                //time是msg弹框的显示时间,默认三秒,这里是10秒

                layer.msg('特性:'+JSON.stringify(data.cardPower),{icon:6,time:10000});

            } else if (obj.event === 'del') {

                layer.confirm('真的删除行么', function (index) {
                    obj.del();
                    layer.close(index);
                    // 获取对象的id,cardId为自己命名的名称
                    console.log(data.cardId);
                    // 重载,'idTest'为table的id
                    table.reload('idTest',{
                        // servlet路径
                        url: '${pageContext.request.contextPath}/cards?method=del',
                        // 传过去附带的参数内容
                        where:{
                            'id[]' : data.cardId
                        }
                    });

                });
            } else if (obj.event === 'edit') {
                layer.alert('编辑行:<br>' + JSON.stringify(data))
            }
        });

java代码

    public void del(HttpServletRequest request, HttpServletResponse response) throws ServletException,
            IOException {


        // 获取参数
        String[] ids = request.getParameterValues("id[]");
        // 调用根据id删除数据的方法
        cardService.deleteByIds(ids);
        // 调用all方法,响应数据
        allData(request, response);

    }


    public void allData(HttpServletRequest request, HttpServletResponse response) throws ServletException,
            IOException {

        // 获取分页的参数(当前第几页),因为没有设置过“p”的值,所以默认为0
        String currentPage = request.getParameter("page");
        // 正因为为0,所以这里半段是否为空是返回true的
        if(StringUtils.isEmpty(currentPage)) {
            // 初始化当前页数为1
            currentPage = "1";
        }
        // 设置每页显示的条数
        // 创建一个分页对象    转换为数字对象类型  传入当前页数
        Page page = Page.of(Integer.valueOf(currentPage));

        // 获取查询的条件  若jsp那边没有form表单提交的查询条件,
        // 那么这里就啥都没有,所以执行的条件查询就不会带条件去查询,
        // 所以查询到的结果将会为所有卡牌数据
        Map<String, String[]> parms = request.getParameterMap();

        // 调用分页方法获取数据,这个数据里面放了一页里能存放的所有卡牌
        Page<Card> cardsPage = cardService.myFindPageCard(page, parms);

        // 这里我将json封装了一下,具体内容在下面的代码块
        LayuiData layuiData = new LayuiData();
        layuiData.setCode(0);
        layuiData.setCount(cardsPage.getTotalCount());
        layuiData.setMsg("");
        // cardPage.getPageData为分页后的数据集合(List)
        layuiData.setData(cardsPage.getPageData());
        // 把对象转成JSON,这里我用的是阿里爸爸的fastjson,如果你的是maven项目,那么直接在pom.xml里面放入
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.61</version>
        </dependency>
        // 就可以了
        // 将封装后的数据转成json格式的数据
        String jsonString = JSONObject.toJSONString(layuiData);
        // 设置响应的格式
        response.setContentType("application/json;charset=utf-8");
        // 将数据响应到浏览器
        PrintWriter writer = response.getWriter();
        writer.print(jsonString);
        writer.close();

    }
// LayuiData对象
public class LayuiData {

    private int code;
    private String msg;
    private int count;
    private List data;

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public int getCount() {
        return count;
    }

    public void setCount(int count) {
        this.count = count;
    }

    public List getData() {
        return data;
    }

    public void setData(List data) {
        this.data = data;
    }
}
// page对象
public class Page<T> {
    /**
     * 分页后的数据集合
     */
    private List<T> pageData;
    /**
     * 当前的页码
     */
    private Integer currentPage = 1;
    /**
     * 每页显示条数
     */
    private Integer pageSize = 10;
    /**
     * 总条数
     */
    private Integer totalCount;

    public int getPageCount() {
        if (this.totalCount % this.pageSize == 0){
            return this.totalCount / this.pageSize;
        }
        return this.totalCount / this.pageSize + 1;
    }

    /**
     * 创建分页对象
     *
     * @param currentPage 当前页码
     * @return 分页对象
     */
    public static Page of(Integer currentPage) {
        Page page = new Page();
        page.setCurrentPage(currentPage);
        return page;
    }

    /**
     * 获取当前页面后,判断当前页是否大于0
     * @return
     */
    public int getCurrentSize() {
        Integer cp = this.currentPage;
        //判断当前页是否大于0
        if (cp > 0) {
            //大于0后点击前一页就跳到前一页的页面数据
            cp -= 1;
        } else {
            // 否则就没法再下一页

            cp = 0;
        }

        // 判断分页开始的位置是否大于总条数
        int currentSize = cp * this.pageSize;
        if (currentSize > this.totalCount){
            // (5-1)*10   38
            // 获取总分页数
            currentSize = (this.currentPage - 1) * pageSize;
        }
        return currentSize;
    }


    public List<T> getPageData() {
        return pageData;
    }

    public void setPageData(List<T> pageData) {
        this.pageData = pageData;
    }

    public Integer getCurrentPage() {
        return currentPage;
    }

    public void setCurrentPage(Integer currentPage) {
        this.currentPage = currentPage;
    }

    public Integer getPageSize() {
        return pageSize;
    }

    public void setPageSize(Integer pageSize) {
        this.pageSize = pageSize;
    }

    public Integer getTotalCount() {
        return totalCount;
    }

    public void setTotalCount(Integer totalCount) {
        this.totalCount = totalCount;
    }
}

总结:出现数据接口异常的原因是出在没有响应Ajax的请求,也就是没有执行allData方法里面的代码,没有向浏览器发送数据就导致浏览器没有数据可显示,然后人家就只好给你报数据接口异常咯

emmm…这里是萌新一枚,代码写得太丑的话还请前辈不吝赐教0-0

<think> 我们正在讨论LayUI表格的数据重载问题。根据用户的问题,他想知道如何在获取新数据重载表格。在LayUI中,表格重载通常使用`table.reload()`方法,该方法可以重新加载表格数据,并可以传递新的参数(如新的查询条件、页码等)。 参考引用[1]和[2]中的示例,我们看到`table.reload`的基本用法: 1. 引用[1]中,通过点击按钮触发重载重载传递了新的页码(从第一页开始)和查询条件(根据输入框的值)。 2. 引用[2]中,通过表单的输入事件触发重载,传递了查询条件(输入框的值)。 但是,用户的问题是在“获得新数据后”进行重载。这里需要注意的是,LayUI的`table.reload`方法并不是直接用来加载已获取的数据,而是会重新向服务器请求数据。也就是说,我们通常通过改变参数(如where条件)来让表格重新请求数据,而不是将新数据直接传递给它。 然而,如果用户已经拿到了新数据(比如通过其他接口获取),想要直接刷新表格而不重新请求服务器,那么应该使用`table.reload`的另一种形式?实际上,LayUI的表格重载主要是用于重新请求数据,而不是直接加载本地数据。 但是,LayUI表格也支持直接赋值本地数据。我们可以通过`table.cache`来更新数据,然后重新渲染表格?但是这种方法并不是官方推荐的重载方式,而且可能会遇到一些问题。 实际上,LayUI表格提供了`reload`和`ins`(实例)的方法来重载,但更常见的是使用`reload`重新请求数据。 如果用户已经获取到了新数据(本地数据),那么可以使用以下步骤: 1. 使用`table.cache`来更新表格对应的缓存数据(需要知道表格的id和对应的行索引等,比较麻烦)。 2. 另一种方法是使用`table.render`重新渲染表格,但这样会重新初始化表格,可能不是最佳选择。 但是,从LayUI的官方文档来看,更推荐的做法是:如果你要重新加载数据,应该使用`table.reload`并传递新的参数(让表格自己去请求数据),而不是手动赋值。 所以,如果用户已经通过其他方式获取了数据,那么建议将新数据设置到表格的缓存中,然后使用`table.reload`方法重新渲染。但注意,`table.reload`本身是用于重新请求数据的,它不会使用你本地的数据(除非你使用的是本地数据表格)。 对于使用本地数据(即`data`参数为本地数组)的表格,我们可以通过以下步骤更新: 1. 更新数据源(即你最初传递给表格的data数组)。 2. 然后调用`table.reload`,但是这样不会生效,因为`table.reload`会重新请求?不对,对于本地数据,`table.reload`并不会重新请求,但是它会重新使用最初的数据源(即你第一次渲染提供的数据源)。所以,我们需要在重新渲染前更新最初的数据源。 实际上,对于本地数据,官方提供了另一种方法:使用`table.init`重新初始化一个表格,但这会重新渲染整个表格,包括表头等,可能会影响性能。 在LayUI中,如果表格是本地数据,我们可以这样重载: ```javascript // 假设我们有一个表格实例,id为'test' // 第一步:更新原始数据(假设原始数据为oldData,现在有新数据newData) var oldData = []; // 这是初始渲染数据,需要更新为newData // 第二步:用新的数据重新渲染 table.reload('test', { data: newData }); ``` 但是,根据LayUI的文档,`table.reload`方法在重载,可以传递`data`参数来更新本地数据。所以,对于本地数据源的表格,我们可以通过传递新的`data`数组来重载。 因此,针对用户的问题,如果他是从服务器获取了新数据(不是通过表格的请求,而是其他方式),并且表格是本地数据模式,那么可以这样重载: ```javascript // 假设表格的id为'test' table.reload('test', { data: newData // 这里的新数据必须是数组 }); ``` 如果表格是服务端分页模式(即通过url请求数据),那么通常我们不应该直接赋值数据,而是应该通过改变查询条件然后让表格重新向服务器请求数据。但是,如果用户已经获取到新数据(比如通过其他方式请求了数据),仍然想用这些数据刷新表格(而不重新请求),那么我们可以临将这个新数据赋值给表格(虽然不是常规做法,但可行): 1. 将表格的url设置为空(或者设置一个假url)并设置data为本地数据,然后重载?这样会改变表格的配置,后续的分页等可能会受影响。 所以,更简洁的做法是:无论表格是本地数据还是服务端数据,如果我们想用本地数据刷新,可以先将表格的url设置为空,然后通过data参数传递新数据。例如: ```javascript table.reload('test', { url: '', // 置为空,表示使用本地数据 data: newData, page: false // 关闭分页,或者根据你的需要设置 }); ``` 但是,如果用户希望保持原有的配置(比如分页配置),那么可能需要谨慎处理。 根据引用[3]中的问题,如果重载后toolbar的事件获取不到data,可能是因为重载后表格重新渲染了,而toolbar的模板没有重新处理。所以,对于toolbar的处理,我们可能需要将一些状态值传递到模板中,这可以通过在重载传递新的参数,然后在模板中根据这些参数来渲染。 总结: 1. 如果是服务端数据,通常的做法是改变查询条件(where参数)或者页码,然后重新请求服务器。 2. 如果是本地数据,可以直接通过`table.reload`传递新的data数组来更新。 3. 如果已经获取了新数据(本地数据),并且表格原本是服务端模式,但想临用本地数据刷新,可以临将url置为空,然后传入data。 因此,针对用户的问题,我们可以给出两种方案: 方案一(推荐,适用于服务端模式):通过改变查询条件,让表格重新从服务器获取数据。 ```javascript // 例如: table.reload('testReload', { where: { // 新的查询条件 key: value }, page: { curr: 1 // 如果需要回到第一页 } }); ``` 方案二(适用于本地数据或临本地数据):直接传入新数据。 ```javascript table.reload('testReload', { data: newData, // 新数据数组 url: '', // 如果之前是服务端,这里置为空,表示使用本地数据 page: false // 如果不需要分页 }); ``` 注意:在方案二中,如果之前是服务端分页,那么分页信息可能就不存在了,因为数据是本地一次性给的。所以,如果数据量很大,需要分页,那么最好还是使用服务端模式,通过重新请求来刷新数据。 根据用户的问题,他可能已经获取了新数据(可能是本地数据,也可能是通过其他方式从服务器获取的数据),所以我们需要根据他的实际情况给出建议。由于问题中没有明确,我们可以给出两种情况的解决方案。 另外,引用[3]中提到,在重载后toolbar的事件获取不到data,这可能是因为重载后表格重新渲染,而绑定的事件丢失。所以,如果用户需要在重载后保留某些状态,可能需要重新绑定事件,或者将状态存储在外部变量中,然后在模板中根据这些变量来渲染。 因此,我们可以这样回答用户: 在LayUI中,表格重载主要有两种方式: 1. 重新请求数据:使用`table.reload`方法,改变查询条件(`where`)或分页信息(`page`),表格会根据配置的URL重新请求数据。 2. 使用本地数据:通过`table.reload`方法,传入新的`data`数组(同将`url`置空,避免请求服务器)。 具体示例代码: 方式一(重新请求): ```javascript table.reload('tableId', { where: { // 查询条件 key1: value1, key2: value2 }, page: { curr: 1 // 重新从第一页开始 } }); ``` 方式二(本地数据): ```javascript table.reload('tableId', { url: '', // 置空URL,使用本地数据 data: [/* 新数据数组 */], // 直接传入数据 page: false // 关闭分页(如果不需要) }); ``` 注意:如果表格原本配置了分页,并且你希望保持分页,那么对于本地数据LayUI会自动进行前端分页。但是,如果数据量很大,前端分页可能会有性能问题。 另外,重载后表格会重新渲染,可能会导致之前绑定的事件失效(如toolbar事件)。为了解决这个问题,可以将一些状态值通过模板参数传递,在模板中根据这些状态值来初始化按钮状态。例如: 在重载,可以传递额外的参数: ```javascript table.reload('tableId', { // ...其他参数... toolbar: '#toolbarDemo', // 重新指定工具栏模板 myCustomData: { // 自定义参数,可以在模板中使用 ifUpdateTime: newValue } }); ``` 然后,在模板中,可以通过`d.myCustomData.ifUpdateTime`来获取这个值: ```html <script type="text/html" id="toolbarDemo"> {{# if(d.myCustomData.ifUpdateTime){ }} <button class="layui-btn layui-btn-disabled">按钮</button> {{# } else { }} <button class="layui-btn">按钮</button> {{# } }} </script> ``` 这样,在重载传入自定义参数,就可以在模板中根据这个参数来渲染不同的按钮状态。 因此,用户可以根据自己的实际需求选择重载方式。 </think> 在 LayUI 中,表格数据重载主要通过 `table.reload()` 方法实现。根据您的需求,以下是两种常用的重载方法及示例: ### 方法一:通过条件参数重载(推荐) 此方法通过更新查询条件(`where`参数)触发表格重新请求数据,适用于数据源来自后端接口的场景: ```javascript // 示例:根据输入框值重载数据 table.reload('tableId', { // 'tableId'需与表格渲染的id一致 where: { searchKey: $('#searchInput').val() // 获取新参数 }, page: { curr: 1 // 通常重置到第一页 } }); ``` * **适用场景**:搜索过滤、参数变更后刷新数据[^2] * **特点**:自动向后端发起新请求,返回最新数据 ### 方法二:强制刷新当前页 若只需刷新当前页数据(不重置页码): ```javascript table.reload('tableId', { where: { ... }, // 可保留现有参数 url: newDataUrl, // 可选:更新数据源地址 done: function(res) { console.log('新数据已加载', res.data) } }); ``` ### 常见问题解决 1. **重载后工具栏状态失效** 通过 `toolbar` 模板传递自定义参数: ```javascript table.reload('tableId', { toolbar: '#toolbarTpl', // 重新关联模板 myCustomParam: ifUpdateTime // 传递动态参数 }) ``` 模板中通过 `d.myCustomParam` 获取值[^3]: ```html <script type="text/html" id="toolbarTpl"> {{# if(d.myCustomParam){ }} <button class="layui-btn-disabled">不可操作</button> {{# } }} </script> ``` 2. **重载不生效检查项** - 确认 `tableId` 与初始化渲染的 `id` 一致 - 检查 `where` 参数格式是否符合接口要求 - 避免在 `done` 回调中重复调用重载方法 > 实践建议:优先使用 `where` 参数驱动重载,符合 LayUI数据流设计。若需强制刷新整个表格,可结合 `table.init()` 重新初始化[^1]。 --- ### 相关问题 1. LayUI 表格重载如何保留当前分页位置? 2. 如何实现 LayUI 表格的客户端数据过滤(不请求后端)? 3. 表格重载后事件绑定失效如何解决? [^1]: LayUI 官方重载示例 [^2]: 搜索条件驱动的表格重载场景 [^3]: 表格重载后工具栏状态管理方案
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值