如果一个表为true,如何将其他表的复选框设置为启用?

How to set Checkboxes for other tables to enabled if one table is true?

提问人:CodingNeeded 提问时间:11/6/2023 最后编辑:CodingNeeded 更新时间:11/7/2023 访问量:52

问:

我有一个正在使用 ajax 进行验证的表,返回的结果是 true,我还设置了一个全局标志,如果该表的验证为 true,那么所有其他表的复选框也应该启用,但由于某种原因它不起作用,我不知道为什么。通过验证的表正在工作 'tabCSite1' 和 'tabCEquip1',其中它的复选框已启用,但对于其他类型表,它不起作用。代码如下:

    function getDetailsCheckJob(data, typetable, checkboxname,t) {
    
    var tblC = document.getElementById(typetable);
    for (var i = tblC.rows.length - 1; i > 0; i--) {
        tblC.deleteRow(i);
    }

    Row = data.split('[');

    var tab = document.getElementById(typetable);
    var valid_asb = false;
    var valid_FTTH = false;
    var tabCSite1Valid = false;

    for (var p = 0; p < Row.length - 1; p++) {
        var row = tab.insertRow(p + 1);

        row.style.background = "#e8eef4";
        row.style.whiteSpace = "nowrap";

        splitData = Row[p + 1].split('|');
        

        if (splitData[0] == "Y") {
            row.insertCell(0);
            tab.rows[p + 1].cells[0].innerHTML = "<input type=\"checkbox\" id=\"valueZ\" name=\"" + checkboxname + "\" value=\"" + splitData[1] + "\" checked/>"; //checked
        }
        else if (splitData[0] == "N") {
            row.insertCell(0);
            tab.rows[p + 1].cells[0].innerHTML = "<input type=\"checkbox\" id=\"valueZ\" name=\"" + checkboxname + "\" value=\"" + splitData[1] + "\"/>";
        }
      
       if (typetable == "tabCEquip1") {
           checkValidation(splitData[2], splitData[28], splitData[29], t, jobID, function (resp) {

               valid_asb = resp.isASBExist;
               valid_FTTH = resp.isFTTHExist;
           });
        }

        else if (typetable == "tabCSite1") {

        checkValidation(splitData[2], splitData[23], splitData[29], t, jobID,function (resp) {
            valid_asb = resp.isASBExist;
            valid_FTTH = resp.isFTTHExist;
            tabCSite1Valid = valid_FTTH; // Update the global flag here
            console.log('tabCSite1Valid inside: ', tabCSite1Valid);
        });
        }

        var splitDatalen = splitData.length;

        if (typetable == "tabCEquip1" || typetable == "tabCSite1") {
            splitDatalen = splitDatalen - 3;
        }
        else {
            splitDatalen = splitDatalen - 1;
        }

        for (var i = 1; i < splitDatalen; i++) {

            console.log('tabCSite1Valid inside other one: ', tabCSite1Valid);
            //alert(splitData.length);
            row.insertCell(i);
            styleData = splitData[i + 1];
                if (typetable == "tabCEquip1" || typetable == "tabCSite1" || typetable == "tabCSBoundary1" || typetable == "tabLPcomm1" || typetable == "tabAddCardSplit1" || typetable == "tabDelEquip1" || typetable == "tabDelPath1" || typetable == "tabDelSB1" || typetable == "tabCPathConsumer1" || typetable == "tabCreateServiceOLT1") {
                    if (tabCSite1Valid == false) {
                        tab.rows[p + 1].cells[0].innerHTML = "<input type=\"checkbox\" id=\"valueZ\" name=\"" + checkboxname + "\" value=\"" + splitData[1] + "\" disabled/>";
                        styleData = "<span style='color: red'>" + splitData[i + 1] + "</span>";
                        console.log('Activated at FTTH');
                    }
                if (splitData[3] != "ASB" && valid_asb == true) { //else && valid_FTTH == false
                    tab.rows[p + 1].cells[0].innerHTML = "<input type=\"checkbox\" id=\"valueZ\" name=\"" + checkboxname + "\" value=\"" + splitData[1] + "\" disabled/>";
                    styleData = "<span style='color: red'>" + splitData[i + 1] + "</span>";
                    console.log('Activated at ASB');
                }
            }
            tab.rows[p + 1].cells[i].innerHTML = styleData;
        }
    }
}

问题是最后一个的 for 循环,表 tabCEquip1 和 tabCSite1 的“tabCSite1Valid”为 true。我什至将其设置为全局,但对于所有其他表仍然不是这样。我哪里出了问题以及如何解决?

从图中可以看出,该复选框应该被启用,因为“tabCSite1Valid”是 true,而是 false

enter image description here

JavaScript C# Razor 复选框

评论

0赞 J.Porter 11/6/2023
我能看到你的设计吗?例如,PNG 或总应用代码
0赞 CodingNeeded 11/6/2023
您好,我添加了一张图片

答:

0赞 Keyboard Corporation 11/6/2023 #1

包含条件检查的 可能在完成处理之前执行。这意味着,当 检查其值时,即使它被更新到以后。for looptabCSite1ValidcheckValidationtabCSite1Validfalselooptrue

也许当您将回调函数移到内部时,它会解决您的问题。loopcheckValidation

修改了该部分中的代码;

if (typetable == "tabCSite1") {
   checkValidation(splitData[2], splitData[23], splitData[29], t, jobID,function (resp) {
       valid_asb = resp.isASBExist;
       valid_FTTH = resp.isFTTHExist;
       tabCSite1Valid = valid_FTTH; // Update the global flag here
       console.log('tabCSite1Valid inside: ', tabCSite1Valid);

       // Move the for loop inside the callback function
       for (var i = 1; i < splitDatalen; i++) {
           console.log('tabCSite1Valid inside other one: ', tabCSite1Valid);
           //alert(splitData.length);
           row.insertCell(i);
           styleData = splitData[i + 1];
           if (typetable == "tabCEquip1" || typetable == "tabCSite1" || typetable == "tabCSBoundary1" || typetable == "tabLPcomm1" || typetable == "tabAddCardSplit1" || typetable == "tabDelEquip1" || typetable == "tabDelPath1" || typetable == "tabDelSB1" || typetable == "tabCPathConsumer1" || typetable == "tabCreateServiceOLT1") {
               if (tabCSite1Valid == false) {
                  tab.rows[p + 1].cells[0].innerHTML = "<input type=\"checkbox\" id=\"valueZ\" name=\"" + checkboxname + "\" value=\"" + splitData[1] + "\" disabled/>";
                  styleData = "<span style='color: red'>" + splitData[i + 1] + "</span>";
                  console.log('Activated at FTTH');
               }
               if (splitData[3] != "ASB" && valid_asb == true) { //else && valid_FTTH == false
                  tab.rows[p + 1].cells[0].innerHTML = "<input type=\"checkbox\" id=\"valueZ\" name=\"" + checkboxname + "\" value=\"" + splitData[1] + "\" disabled/>";
                  styleData = "<span style='color: red'>" + splitData[i + 1] + "</span>";
                  console.log('Activated at ASB');
               }
           }
           tab.rows[p + 1].cells[i].innerHTML = styleData;
       }
   });
}

上面的代码确保仅在 完成处理后执行,这应该允许在 检查其值时执行。loopcheckValidationtabCSite1Validtruefor loop

此外,如果需要在 之外使用 for 循环,则可能需要重构代码以处理函数的异步性质。这可能涉及使用 Promise 或 async/await 来处理异步操作。checkValidationcheckValidation

附加代码

使用回调函数处理 AJAX 调用的结果。这样,您可以确保代码执行等待 AJAX 调用完成,然后再继续。

function getDetailsCheckJob(data, typetable, checkboxname,t) {
   // ... existing code ...

   for (var p = 0; p < Row.length - 1; p++) {
       // ... existing code ...

       if (typetable == "tabCEquip1") {
           checkValidation(splitData[2], splitData[28], splitData[29], t, jobID, function (resp) {
               valid_asb = resp.isASBExist;
               valid_FTTH = resp.isFTTHExist;
               handleValidationResult(typetable, splitData[1], checkboxname);
           });
       }

       else if (typetable == "tabCSite1") {
           checkValidation(splitData[2], splitData[23], splitData[29], t, jobID,function (resp) {
               valid_asb = resp.isASBExist;
               valid_FTTH = resp.isFTTHExist;
               tabCSite1Valid = valid_FTTH; // Update the global flag here
               handleValidationResult(typetable, splitData[1], checkboxname);
           });
       }

       // ... existing code ...
   }
}

function handleValidationResult(typetable, value, checkboxname) {
   // ... code to handle the validation result ...
   // This code should be moved from the loop in the getDetailsCheckJob function
   // to this new function.
}

评论

0赞 CodingNeeded 11/6/2023
我正在使用一个非常旧的 .net,它不支持 async/await,这就是为什么我遇到问题的原因,循环中的回调函数我遇到了问题,因为行没有正确出来