1

Jsコードを介してインスタンスを操作しようとしていますが、フォームをリロードするたびに、少なくとも1つのノードに「バインディング」属性が含まれているとインスタンスが機能しなくなるため、まったく成功しません。XSLT フォーム エンジンは、ロードされるたびに新しい値を取得することを知っています。また、ローカルに保存されたインスタンス ファイルを「再検証」する必要がありますが、それを行う方法が本当に見つかりません。

私はいくつかの試みをしましたが、うまくいきましたが、フォームを閉じるまではうまくいきます。フォームを再度開く (そして 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_ で始まるすべての属性を削除し、再度読み込みを試みることにしましたが、どちらも機能しませんでした。

最後の例外を除くすべてのケースで、次の例外がスローされます: Error Dispatching event 'xsltforms-revalidate': ... TypeError document.getElementById(...) is null

では、Javascript から新しいインスタンスを動的にロードして再検証する方法はありますか? どんなアイデアでも大歓迎です、事前に感謝します!

4

1 に答える 1

0

インスタンス構造をjavascriptで操作しても全く問題ありませんでした。この問題は、ユーザーが手動でデータを変更することをブロックするためにサブフォームで使用したバインド宣言が原因でした。例えば

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

私はそれを削除し、すべてがうまくいったので、Jsを介してそれらの入力を読み取り専用にすることにしました...それと同じくらい簡単です。

問題は、バインディング要素が現在のサブフォームに割り当てられ、属性の一部がその数に依存することです。別のインスタンスをロードすると、xsltform エンジンはその「サブフォーム カウント」を再起動して再度開始します。バインディング要素をバインドできないため、エンジンを混乱させてエラーをスローするようです。

于 2015-05-09T19:44:53.597 に答える