提问人:CodingNeeded 提问时间:11/6/2023 最后编辑:CodingNeeded 更新时间:11/7/2023 访问量:52
如果一个表为true,如何将其他表的复选框设置为启用?
How to set Checkboxes for other tables to enabled if one table is true?
问:
我有一个正在使用 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
答:
包含条件检查的 可能在完成处理之前执行。这意味着,当 检查其值时,即使它被更新到以后。for loop
tabCSite1Valid
checkValidation
tabCSite1Valid
false
loop
true
也许当您将回调函数移到内部时,它会解决您的问题。loop
checkValidation
修改了该部分中的代码;
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
此外,如果需要在 之外使用 for 循环,则可能需要重构代码以处理函数的异步性质。这可能涉及使用 Promise 或 async/await 来处理异步操作。checkValidation
checkValidation
附加代码
使用回调函数处理 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.
}
评论