Динамически (Js) замена и проверка экземпляра XSLTForms
Я пытаюсь манипулировать экземпляром с помощью Js-кода, но безуспешно, потому что каждый раз, когда вы перезагружаете форму, экземпляр больше не работает, если он содержит атрибуты 'binding' как минимум на одном узле. Я знаю, что движок форм 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 ". Итак, я решил удалить все атрибуты, начиная с xsltforms_ XML, прежде чем сохранить его, и попытаться загрузить его снова, но он тоже не сработал.
Во всех случаях, кроме последнего, выдается следующее исключение: Ошибка отправки события 'xsltforms-revalidate': ... TypeError document.getElementById(...) имеет значение null
Итак, есть идеи, как динамически загружать и повторно проверять новый экземпляр из Javascript? Любая идея приветствуется, спасибо заранее!
1 ответ
Не было никаких проблем с манипулированием структурой экземпляра с помощью JavaScript. Проблема была из-за обязательных объявлений, которые я использовал в подчиненной форме, чтобы заблокировать пользователя для изменения данных вручную. Например
<xf:bind nodeset="/application/params/param[@id='id']" readonly="true()" />
<xf:bind nodeset="/application/params/param[@id='description']" readonly="true()" />
Я удалил это, и все прошло хорошо, поэтому я решил сделать этот ввод только для чтения через Js... Так просто.
Дело в том, что элементы привязки назначаются текущей подчиненной форме, и часть атрибутов зависит от этого числа. Когда вы загружаете другой экземпляр, механизм xsltform перезапускается, который "подсчитывает число подчиненных" и запускается снова, и это, кажется, сбивает с толку механизм и выдает ошибку, потому что не может связать элементы привязки.