如何使用 Thymeleaf 和 JQuery 绑定动态子列表?

How to bind a dynamic child list using Thymeleaf and JQuery?

我是一个完全的新手,我真的希望你能帮助我!

我有两个实体:配方和产品。配方对象包含产品列表,大小 这是由用户“控制”的——它根据用户想要的产品数量而变化 包括。

这是我的配方实体

@Entity
@Table(name = "recipes")
public class RecipeEntity extends BaseEntity {

    private String name;
    private String shortDescription;
    private String cookingInstructions;
    private Integer cookingTime;
    private Integer portions;
    private List<ProductEntity> products;
    
    //GETTERS, SETTERS

这是产品实体

@Entity
@Table(name = "products")
public class ProductEntity extends BaseEntity {

    private String name;
    private Double quantity;
    private RecipeEntity recipe;
    
    //GETTERS, SETTERS

这是 Thymeleaf 模板:

 <h4>Products</h4>

 <div class="products" th:each="product, iterStat : *{products}">
   <div class="product row">


     <div class="col-lg-6 mb-3">
       Name
       <input th:field="*{products[__${iterStat.index}__].name}" id="product" class="form-control form-control-lg" />
     </div>

     <div class="col-lg-6 mb-3">
       Quantity(grams)
       <input th:field="*{products[__${iterStat.index}__].quantity}" type="number" id="quantity" step="0.1" min="0" class="form-control form-control-lg" />
     </div>

   </div>
 </div>

 <button type="button" class="add-product btn btn-outline-secondary col-lg-12">+ Add another
   product
 </button>

最后我们有了 JQuery 动态添加产品行的函数:

$(document).ready(function () {
    $('.add-product').click(function () {
        let newRow = jQuery('<div class="product row">' +
            ' <div class="col-lg-6 mb-3">' +
            ' Name' +
            ' <input type="text" class="form-control form-control-lg"/>' +
            ' </div>' +
            ' <div class="col-lg-6 mb-3">' +
            '  Quantity(grams)' +
            ' <input type="number" step="0.1" min="0"' +
            ' class="form-control form-control-lg"/>' +
            '</div>' +
            '</div>');

        $('.products').append(newRow)

现在的问题是我想根据 post 请求获取所有产品以及配方,并且 将它们一起保存到数据库中。 JQuery 函数工作正常,它确实附加了产品行, 然而,当我 post 向我的 RecipeController 发送信息时,产品列表是空的。

如果有人能告诉我正确的方向,我将非常感激,因为我完全迷失在这个方向上!提前谢谢大家!

我已经通过更多的研究设法解决了我自己的问题,所以我将post这里的答案,以防将来有人觉得它有用。

发现这个 post 真的很有帮助 -How to get dynamic input box data using Thymeleaf?

thymeleaf 模板并不是我最初认为的问题。 我编写的 JQuery 函数存在问题。

这是有效的 JQuery 函数,它不仅在客户端附加行,而且还将父对象 Recipe 与子列表 Products 一起传输到我的 RecipeController。

$(document).ready(function () {
    let max_fields = 30;
    let index = 1;


    $('.add-product').click(function () {

        if (index < max_fields) {
            let newRow = jQuery('<div class="product row">' +
                ' <div class="col-lg-6 mb-3">' +
                ' Name' +
                ' <input name="products[' + index + '].name" type="text" class="form-control form-control-lg"/>' +
                ' </div>' +
                ' <div class="col-lg-6 mb-3">' +
                '  Quantity(grams)\n' +
                ' <input name="products[' + index + '].quantity" type="number" step="0.1" min="0"' +
                ' class="form-control form-control-lg"/>' +
                '</div>' +
                '</div>');

            index++;

            $('.products').append(newRow)
        }

    });
});

我要注意的一件事是,包含名称和数量的标签可能会更好,但即使没有它们,代码也能按预期工作!