下記のKviewer プラグインコードで、subTable中のカラムを条件付きで非表示にしようとしたら、何んだか 良く解らないタイミングで、上手く非表示にできたり、非表示にできなかったりして、動作が不安定になっています。
特に、kv.events.record.mountedイベントハンドラの中で、setTimeout関数を使って、dom更新処理を遅延させないと、非表示にしようとした<td>タグ部のstyleが「style=“padding: 1em;”」というkviewerのレコード詳細画面の設定として指定していた値に上書きされてしまって、非表示とならない頻度が 高まります。
それは、多分、kv.events.record.mountedイベントの公式ドキュメントに記載されていた「※内部的に状態は変更されますが、DOMに変更が反映されない場合があります。」というのに 関連するのだろうと思います。
もっと 確実に、KviewerのsubTable中のカラムを条件付きで非表示にできる方法を、教示 いただけないでしょうか?
const hide_TableCol_byLabel = (tableFieldCode: string,
fieldCode: string,
label: string
): void => {
// @ts-ignore
const targetTableEl1 = kv.detail.getElementByCode(tableFieldCode);
let targetHeaderColEl1: HTMLElement;
let targetHeaderColIndex: number;
if (targetTableEl1?.children[0]?.children[1]?.children[0]?.children[0]?.children?.length > 0) { // HTMLCollectionのforEach関数はundefined
for (let colIndex = 0; colIndex < targetTableEl1.children[0].children[1].children[0].children[0].children.length; colIndex++) {
const f = targetTableEl1.children[0].children[1].children[0].children[0].children[colIndex];
if (f.children[0].innerText === label) { // headerに表示しているcolのFieldCodeとラベルが異なるので、labelで、対象カラムを探す
targetHeaderColEl1 = f;
targetHeaderColIndex = colIndex;
}
}
}
if (targetHeaderColEl1) {
targetHeaderColEl1.style.display = 'none'; // header行のCOLを非表示
if (targetTableEl1.children[0]?.children[1]?.children[1]?.children?.length > 0) {
// targetBodyColRowsEl2.forEach((r: any) => { // bodyの各行について
for (let rowIndex = 0; rowIndex < targetTableEl1.children[0].children[1].children[1].children.length; rowIndex++) {
const r: HTMLElement = targetTableEl1.children[0].children[1].children[1].children[rowIndex];
// r.style.display = 'none'; // 所定のtdカラムを非表示
// @ts-ignore
r.children[targetHeaderColIndex].children[0].style.display = 'none'; // 所定のtdカラム配下のdivを非表示
// @ts-ignore
r.children[targetHeaderColIndex].children[0].innerHTML = ''; // 所定のtdカラム配下のdivを非表示
// @ts-ignore
r.children[targetHeaderColIndex].style.display = 'none'; // 所定のtdカラムを非表示
}
}
} else {
// @ts-ignore
console.error("At hide_TableCol_byLabel: field not find: table=" + tableFieldCode + " " + label, targetHeaderColEl1)
}
};
///////////////////////////////
kv.events.record.mounted.push(function (state) {
setTimeout(() => {
hide_TableCol_byLabel("テーブルのfieldCode", "カラムのfieldCode", "カラムのラベル");
}, 32);
}