动态 (Js) 替换和验证 XSLTForms 实例

Dynamically (Js) replacing and validating an XSLTForms instance

我试图通过 Js 代码操作一个实例,但完全没有成功,因为每次您重新加载表单时,如果实例至少在一个节点中包含 'binding' 属性,该实例将不再工作。我知道 XSLT 表单引擎每次加载时都会采用一些新值,而我的 - 本地保存 - 实例文件必须是 "revalidated",但我真的找不到这样做的方法。

我做了一些尝试,他们成功了,但他们一直这样做,直到我关闭表格。每次我重新打开表单(并加载 XSLTForms 引擎的新实例)时,它们都无法再加载。

var model = document.getElementById('my-model').xfElement;

window.XsltForms_globals.openAction("XsltForms_change");        
xmlToLoadIn.parentNode.replaceChild(newXmlNode,xmlToLoadIn);
model.xfElement.addChange(newXmlNode);
window.XsltForms_globals.closeAction("XsltForms_change");

同样通过注入 xml 对象:

model.defaultInstance.src = "";
model.defaultInstance.srcXML = newXmlNode;

或者甚至尝试一切我能看到的可能的神奇方法:

model.rebuild();
model.recalculate();
model.revalidate();

还有实例:

model.defaultInstance.revalidate();
model.defaultInstance.validate_(newXmlNode); 
model.defaultInstance.validation_(newXmlNode);

唯一没有破坏应用程序的工作是:

model.defaultInstance.setDoc(newXmlNode);

但它并没有真正起作用,因为从未加载实例,当我导航到下一个子表单时,会显示一条消息:无法解析 XML.

在所有情况下,除了最后一个只是擦除实例之外,实例属性总是相同的,所以我认为这些值没有被重新验证。例如。 xsltforms_depfor="44 48 52 58 8 12 18 4"。所以,我决定在保存之前删除XML的所有以xsltforms_开头的属性,并尝试再次加载它,但它也没有用。

在所有情况下,除了最后一个,都会抛出以下异常:调度事件错误 'xsltforms-revalidate': ... TypeError document.getElementById(...) is null

那么,知道如何从 Javascript 动态加载和重新验证新实例吗?欢迎任何想法,提前致谢!

通过javascript操作实例结构完全没有问题。问题是由于我在子表单中使用绑定声明来阻止用户手动修改数据。例如

<xf:bind nodeset="/application/params/param[@id='id']" readonly="true()" />
<xf:bind nodeset="/application/params/param[@id='description']" readonly="true()" />

我删除了它,一切正常,所以我决定通过 Js 将这些输入设置为只读...就这么简单。

问题是绑定元素被分配给当前子表单,部分属性取决于该编号。当您加载不同的实例时,xsltform 引擎重新启动 "subforms count" 并再次启动,这似乎混淆了引擎并抛出错误,因为无法绑定绑定元素。