从本地存储动态重新填充表行

Posted

技术标签:

【中文标题】从本地存储动态重新填充表行【英文标题】:Repopulate table rows dynamically from localstorage 【发布时间】:2018-03-12 12:55:03 【问题描述】:

给定本地存储中的数据(在 STEP 3)填充表行时出现问题。目前我在下面的备注部分中有两个按钮可以添加/删除行,我可以重复使用吗?

但是,下面是我的场景:

STEP 1 默认情况下会有如下所示的表格html代码,用户可以添加新行或删除选定的行。单击保存按钮后,它将数据保存到本地存储中(代码如下):

<div class="modal fade" id="edit-modal" tabindex="-1" role="dialog" aria-labelledby="myModal-label" aria-hidden="true">
    <input type="button" value="Add row" onClick="addRow('dyn_table')" />
    <input type="button" value="Remove row" onClick="deleteRow('dyn_table')" />
    <div class="form-group">
        <table class="table" id="dyn_table">
            <tbody><tr><td><input type="checkbox" class="big-checkbox" name="chk[]" checked="checked" /></td>
                    <td>
                        <div class="form-group">
                            <label for="dyn_payment_method">Payment Method</label>
                            <select name="dyn_item_code[]" class="dyn_item_code form-control">
                                <option disabled="" selected="" value=""> -- select an option -- </option>
                                <option value="cash">Cash</option>
                                <option value="cheque">Cheque</option>
                                <option value="tt">TT</option>
                                <option value="cc">Credit Card</option>
                            </select>
                        </div>
                        <div class="form-group">
                            <label for="dyn_amount">Amount</label>
                            <input type="number" pattern="[0-9].[0-9]" class="dyn_amount" name="dyn_amount[]" step="0.01">
                        </div>
                        <div class="form-group">
                            <label for="dyn_reference">Reference Number</label>
                            <input type="text" class="dyn_reference" name="dyn_reference[]" class="form-control" >
                        </div>
                    </td>
                </tr>
            </tbody>
        </table>
    </div>
    <button type="submit" class="btn btn-success" id="btnSave">Save</button>
</div>

<table id="myTable">
    <thead>
        <tr>
            <th>ID</th>
            <th>Company</th>
            <th>Invoice No.</th>
            <th>Due Date</th>
            <th>Invoice Amount</th>
            <th>Status</th>
            <th>Actions</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>5</td>
            <td>ABC Inc.</td>
            <td>I0001</td>
            <td>2020-01-01 00:00:00</td>
            <td>USD100</td>
            <td>ACTIVE</td>
            <td><a href="#" data-id="5" data-toggle="modal" data-target="#edit-modal"><i class="fa fa-pencil-square-o" aria-hidden="true"></i> Edit</a></td>
        </tr>
    </tbody>
</table>

STEP 2这是将所有行保存到本地存储(setter)的代码

$('#btnSave').on('click', function(e) 
    e.preventDefault();
    var id = $(this).attr("data-id");
    var mykey = 'set'+id;
    var my_table = [];

    $('#dyn_table tr').each(function()
        var tr = $(this);
        var checkbox = $(this).find('.big-checkbox').is(':checked');
        var itemcode = $(this).find('.dyn_item_code :selected').val();
        var amount = $(this).find('.dyn_amount').val();
        var reference = $(this).find('.dyn_reference').val();

        my_table.push([checkbox, itemcode ,amount, reference]);
    );

    localStorage.setItem(mykey, JSON.stringify(my_table));

);

STEP 3 这是从本地存储(getter)中检索数据的代码,但问题是如何重新填充表格行?

$('#edit-modal').on('show.bs.modal', function(e) 
    var id = $(e.relatedTarget).data('id'); //id from edit button
    var mykey = 'set'+id;

    $('#btnSave').attr('data-id' , id);

    if(localStorage.getItem(mykey)==null)
        console.log('key not found');
     else 
        console.log('key found');

        var lsSetFields = JSON.parse(localStorage.getItem(mykey));
        var checkbox,itemcode,amount,reference = '';

        $.each( lsSetFields, function( key, value ) 
            checkbox = value[0];
            itemcode = value[1];
            amount = value[2];
            reference = value[3];

            console.log('checkbox='+checkbox);
            console.log('itemcode='+itemcode);
            console.log('amount='+amount);
            console.log('reference='+reference);

            // I guess must be doing the table re-populating here,
            // Should I remove all rows then repopulate or ???
        );
    
);

备注

function addRow(tableID) 
    var table = document.getElementById(tableID);
    var rowCount = table.rows.length;
    var row = table.insertRow(rowCount);
    var colCount = table.rows[0].cells.length;
    for(var i=0; i<colCount; i++) 
        var newcell = row.insertCell(i);
        newcell.innerHTML = table.rows[0].cells[i].innerHTML;

    


function deleteRow(tableID) 
    var table = document.getElementById(tableID);
    var rowCount = table.rows.length;

    for(var i=0; i<rowCount; i++) 
        var row = table.rows[i];
        var chkbox = row.cells[0].childNodes[0];
        console.log(chkbox);
        if(null != chkbox && true == chkbox.checked) 
            if(rowCount <= 1) 
                alert("Please remain minimum ONE row. The last row is now preserved.");
                break;
            
            table.deleteRow(i);
            rowCount--;
            i--;
        
    

【问题讨论】:

由于edit-modal 的代码丢失,您能否提供整个 HTML,或者您可以创建 JSFiddle 来重现该问题? edit-modalSTEP 3 中不是吗? 是的,也是显示模态对话框的按钮。如果您能提供完整的代码以获得好的答案,将会很有帮助。 嗨,我已经包含了一个将触发模式的标签。这些是我正在处理的代码,其他的只是库,如数据表、引导程序、jquery.. 【参考方案1】:

您可以按如下方式修改第 3 步,应该可以解决问题。我在下面的代码中更新了 cmets。

$('#edit-modal').on('show.bs.modal', function (e) 
    var id = $(e.relatedTarget).data('id'); //id from edit button
    var mykey = 'set' + id;

    $('#btnSave').attr('data-id', id);

    if (localStorage.getItem(mykey) == null) 
        console.log('key not found');
     else 
        console.log('key found');

        var lsSetFields = JSON.parse(localStorage.getItem(mykey));
        var checkbox, itemcode, amount, reference = '';

        $("#dyn_table tr").not(":first").remove(); //Delete all rows except first

        $.each(lsSetFields, function (key, value) 
            //Clone first row and update input and select fields
            $("#dyn_table tr:first").clone().find("input, select").each(function (index) 
                if (index === 0) $(this).prop("checked", value[index]);
                $(this).val(value[index]);
            ).end().appendTo("#dyn_table");
        );

        //Delete first row
        $("#dyn_table tr:first").remove();
    
);

【讨论】:

嗨,我也有复选框。使用 console.log 我看到该值为真/假。它没有正确设置。如何使其反映正确的复选框? 谢谢。只是一个问题,它如何知道本地存储中的哪个值来填充相应的字段?我确信每一行都会有相同的数据顺序 1:checkbox, 2:select,3:input,4:input。我只想用外行术语知道代码的含义。再次感谢。 由于clone,数据在localstorage中的存储顺序与表行中的字段顺序相同。希望这会有所帮助。

以上是关于从本地存储动态重新填充表行的主要内容,如果未能解决你的问题,请参考以下文章

将当前用户数据从本地存储存储到vue存储的最佳实践?

显示本地存储的图像以响应 JSON 表填充结果

使用本地存储更改填充无效

如何在 Angular 中处理本地存储丢失的项目?

无法通过 file:// 签出本地 svn 存储库

从 URL 加载图像并使用 Swift4 将它们存储在本地