簡體   English   中英

通過 javascript 操作 DOM 時在表格的特定部分顯示項目

[英]Show items in specific parts of a table when manipulating the DOM via javascript

這對你們來說肯定很容易,但它讓我頭暈目眩,我已經忘記了我在做什么。 我還應該指出,我對 Javascript 真的很陌生,代碼的模式讓我感到困惑。

所以......我想要一個如下所示的表,在我使用來自我制作的 API 的數據(來自 msSQL 數據庫)創建的模式中:

<table style="width:100%;">
    <tr>
        <th class="col-12" colspan="2">Academic Routes</th>
    </tr>
    <tr id="preQual_Academic">
        //Only include the rows that have the "preQualTypeId = 1"
    </tr>
</table>

<table style="width:100%;" id="preQual_Access">
    <tr id="preQual_Access">
        <th colspan="2">Access Routes</th>
    </tr>
    <tr id="preQual_Access">
        //Only include the rows that have the "preQualTypeId = 2"
    </tr>
</table>

為此,我從 API 調用中加載 JSON 數據,然后“附加”到“modal-body”內的表中。 這是我的 javascript:

<script>
$.get(url + qualId, function (data) {
    $.each(data, function (i, item) {
        $('#preQual_Academic').append(
            '<tr><td class="col-8">'
            + item.qualification + " | Level " + item.level
            + '</td><td class="col-4">'
            + '<input type="checkbox" ' + 'value="' + item.isAlternative + '"></input>'
            + '</td></tr>');
        });
    });
});
</script>

如您所見,目前我只是將所有數據傳遞到一個表中,並且沒有進行過濾/條件迭代。

我的問題是......我如何編寫 javascript 以僅將滿足第一個條件(preQualTypeId = 1)的項目放入第一個表(id =“preQual_Academic”),然后將其他項目(其中 preQualTypeId = 2)第二個表(id="preQual_Access")。

注意:我正在使用 ASP.Net Core 使用 Razor 頁面設計應用程序的 rest。

這是來自 API 獲取請求的 output,這樣您就可以看到我正在使用的內容以及“preQualTypeID”的來源:

[{"qual_Main":14,"preQual_Sub":2,"qualificationID":14,"main_Qual":"Degree","main_Level":6,"qualification":"A Levels","level":3,"lmsLink":null,"preQualTypeID":1,"preQualType_Option":"Academic","isAlternative":false},{"qual_Main":14,"preQual_Sub":32,"qualificationID":14,"main_Qual":"Degree","main_Level":6,"qualification":"Higher National Certificate","level":4,"lmsLink":null,"preQualTypeID":2,"preQualType_Option":"Access","isAlternative":true},]

更新以包括基於@paolostyle 建議的答案(感謝您的回答和評論):

所以...由於評論中描述的瀏覽器兼容性,我最終實現了“Var”而不是“Let”,正如@paolostyle 所展示的那樣。 但是,原理是完全一樣的。

這是我對 Javascript 的最終實現:

    <script>
    $(function () {
        $('#preQualModal').modal({
            keyboard: true,
            backdrop: "static",
            show: false,

        }).on('show.bs.modal', function () {
            var url = "/api/PreQualViewData/";
            var qualId = $(event.target).closest('tr').data('id');

            $.get(url + qualId, function (data) {
                $.each(data, function (i, item) {
                    var tableParent = item.preQualTypeID === 1 ? $('#preQual_Academic') : $('#preQual_Access');
                    var isAltTrue = item.isAlternative === true ? '<td class="col-5 text-center"><i class="far fa-check-square"></i></td>' : '<td class="col-4"></td>';

                    tableParent.append(
                        '<tr><td class="col-7">'
                        + item.qualification + " | Level " + item.level
                        + '</td>'
                        + isAltTrue
                        + '</tr >');
                });
            });
        });

        $('#preQualModal').on('hidden.bs.modal', function () {
            $(this).find('#preQual_Academic').html(''),
            $(this).find('#preQual_Access').html('')
        });
    });
</script>

如您所見,一旦我了解我需要使用條件語法創建變量,然后將其應用於最終的 append。 我開始變得更有創意,並添加了...

var isAltTrue = item.isAlternative === true ? '<td class="col-5 text-center"><i class="far fa-check-square"></i></td>' : '<td class="col-4"></td>';

...還有一些代碼。

另外,我遵循@paolostyle 的建議,將 append 更改為每個表的<tbody>而不是<tr> 所以 html 看起來像這樣:

<div class="modal fade hide" id="preQualModal" tabindex="-1" role="dialog" aria-labelledby="preQualsModalLabel" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered" role="document">
    <div class="modal-content">
        <div class="modal-header">
            <h3 class="modal-title" id="preQualsModalLabel">
                <i class="fas fa-graduation-cap"></i>
                Prerequisite Qualifications
            </h3>
            <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                <span aria-hidden="true">&times;</span>
            </button>
        </div>
        <div class="modal-body">
            <table style="width:100%;">
                <thead>
                    <tr>
                        <th class="col-12" colspan="2">Academic Routes</th>
                    </tr>
                </thead>
                <tbody id="preQual_Academic">
                    @*API data goes here*@
                </tbody>
            </table>

            <table style="width:100%;">
                <thead>
                    <tr>
                        <th class="col-7">Access Courses</th>
                        <th class="col-5 text-center">Alternative route</th>
                    </tr>
                </thead>
                <tbody id="preQual_Access">
                    @*API data goes here*@
                </tbody>
            </table>
        </div>

        <div class="modal-footer">
            <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
        </div>
    </div>
</div>

希望這可以幫助像我一樣缺乏 Javascript 知識的人。

您可以確定 append 傳遞給.each的 function 內的行在哪里,例如:

$.each(data, function (i, item) {
    // assuming you only have two possible values for preQualTypeID
    let rowParent = item.preQualTypeID === 1 ? $('#preQual_Academic') : $('#preQual_Access');
    rowParent.append(/* ... */);
});

旁注-您可能不希望 append trtr內, preQual_AcademicpreQual_Access可能應該是tbody


如果你有更多的情況要處理,你可以使用switch或幾個if語句:

let rowParent;  // you can also assign here the "default" value
switch (item.preQualTypeId) {
  case 1:
    rowParent = $('#preQual_Academic');
  break;
  case 2:
    // ...
  break;
  case 3:
    // ...
  break;
  // ...
}

// OR

let rowParent; // you can also assign here the "default" value
if (item.preQualTypeID === 1) {
  rowParent = $('#preQual_Academic');
} else if (item.preQualTypeID === 2) {
  // ...
} else if (item.preQualTypeID === 3) {
  // ...
}

就像我在上面的評論中提到的,你也可以let rowParent = $('#preQual_Academic'); 然后跳過第一個 if/switch 案例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM