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

问题描述 投票:0回答:1

我有一个表正在使用 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。我什至将其设置为全局,但它仍然不适用于所有其他表。我哪里出了问题以及如何解决?

javascript c# razor checkbox
1个回答
0
投票

包含

for loop
条件检查的
tabCSite1Valid
可能会在
checkValidation
完成处理之前执行。这意味着当
tabCSite1Valid
检查其值时,
false
仍然是
loop
,即使稍后它会更新为
true

也许当您将

loop
移动到
checkValidation
的回调函数中时,它会解决您的问题。这确保了
loop
在函数完成处理后执行。

修改了该部分的代码;

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;
       }
   });
}

上面的代码确保

loop
仅在
checkValidation
完成处理后执行,这应该允许当
tabCSite1Valid
检查其值时,
true
for loop

此外,如果您需要在 checkValidation 之外使用

for 循环
,您可能需要重构代码以处理
checkValidation
函数的异步性质。这可能涉及使用 Promises 或 async/await 来处理异步操作。

© www.soinside.com 2019 - 2024. All rights reserved.