Spring和Thymeleaf:刷新表中的单行

时间:2018-10-06 10:29:24

标签: spring spring-mvc spring-boot thymeleaf

我使用以下命令刷新表的内容:

<tr id="rows" th:each="entity: ${entities}">
    <!-- ... -->
</tr>

在服务器端:

@RequestMapping(value = "/replace", method = RequestMethod.GET)
public String replace(Model model) {
    model.addAttribute("entities", entities);
    return "/ :: #rows";
}

使用以下方法调用方法:

$.get('/replace', function(fragment) {
    // fragment gives me all rows of the table
}

可正常使用。但是,我不想每次都更新所有行,而只更新一行,所以我的想法是使用动态id,如下所示:

<tr th:id="'row' + ${entity.id}" th:each="entity, iterStat: ${entities}">
    <!-- ... -->
</tr>

在服务器端:

@RequestMapping(value = "/replace", method = RequestMethod.GET)
public String replace(@RequestParam("id") int id, Model model) {
    model.addAttribute("entities", entities);
    return "/ :: #row" + id;
}

使用以下方法调用方法:

$.get('/replace', {id: id} function(fragment) {
    // fragment is empty
}

但这不起作用。看一下html代码和服务器端,id是正确的。不能使用th:id吗?如果我只想更新表中的一行而不是所有行,那将是一种解决方法?谢谢。

我也尝试过使用th:fragment进行相同操作-在没有${entity.id}的情况下也可以使用。

3 个答案:

答案 0 :(得分:0)

使用th:fragment应该可以解决问题。我通常使用它们来完成您想要做的事情。这是一个实现方法的示例。

<html lang="en" xmlns:th="http://www.thymeleaf.org" xmlns="http://www.w3.org/1999/xhtml">
<head></head>
<body>    
    <th:block th:fragment="entity-row">
        <tr th:id="'row'+${entity.id}">
            <td th:text=${entity.id}></td>
            <!-- Whatever other element you need. -->
        </tr>
    </th:block>
</body>

将上面的代码整个添加到一个新的html文件中。记住,我们期望一个单一的实体,所以我们不需要每个。现在,为了获取片段,您需要在Controller中执行以下操作。

@RequestMapping(value = "/replace/fragment", method = RequestMethod.GET)
@ResponseBody
public String replaceSingleRow(@RequestParam("id") int id, Model model) {
    Entity entity = entityService.findById(id);
    model.addAttribute("entity", entity);
    return "file :: entity-row";
}

文件将是包含片段的html文件的名称。当然,我假设您只是将所需的ID传递给我们的控制器。

答案 1 :(得分:0)

我只能通过以下方式向视图发送一个实体:

Entity entity = entityService.findById(id);
model.addAttribute("entities", entity);

这当然不是最漂亮的方法,但是可以达到预期的效果。

答案 2 :(得分:0)

反应很晚,但是我认为这是最终的解决方案。

胸腺片段

<tr th:fragment="entity-row" th:id="'row' + ${entity.id}" th:each="entity, iterStat: ${entities}">
    <!-- ... -->
</tr>

控制器代码

@RequestMapping(value = "/replace", method = RequestMethod.GET)
public String replace(@RequestParam("id") int id, Model model) {
    Entity entity = entityService.findById(id);
    model.addAttribute("entities", Arrays.asList(entity)); // sending the row as list, so that the loop can iterate and will produce a single row
    return "file :: entity-row";
}

ajax响应中具有所需的单行html,现在您可以替换现有的行

$.get('/replace', {id: id} function(fragment) {
    $("#row" + id).replaceWith(fragment);
}