JSF добавляет исполняемый компонент перед обновлением модели - PullRequest
0 голосов
/ 13 марта 2020

Я новичок в Java EE 8 и пытаюсь реализовать проект для работы со схемами базы данных. Теперь я добавляю перетаскивание атрибутов (div) между таблицами (div) на моей странице JSF, используя стандартный HTML5 API перетаскивания. Во-первых, метод атрибута вызывается из прослушивателя события удаления целевой таблицы:

const data = JSON.parse(e.dataTransfer.getData("text/plain"));
const attribute_block = document.getElementById(data.attribute_block_id);
attribute_block.change_relation(relation_block_id, relation_index);

Затем метод атрибута вызывает командный сценарий (f: commandScript)

attribute_block.change_relation = (relation_block_id, relation_index) =>
    change_relation({relation_block_id: relation_block_id, relation_index: relation_index});

, который был передан во время компонента атрибута сборки. :

animateAttribute(
   document.getElementById("${cc.clientId}:attribute-block"),
     () => document.getElementById("${cc.clientId}:remove").click(), change_relation
)

Командный скрипт вызывает метод управляемого компонента и обновляет компонент родительской (предыдущей) таблицы:

<h:commandScript name="change_relation"
                 execute="${cc.parent.clientId}:relation-block"
                 render="${cc.parent.clientId}:relation-block"
                 action="${attributeController.changeRelation(cc.attrs.attribute)}">
</h:commandScript>

Метод управляемого объекта bean удаляет атрибут из предыдущего списка атрибутов сущности таблицы и добавляет его в новый :

Map<String, String> requestParameterMap = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
String relationBlockId = requestParameterMap.get("relation_block_id");
int relationIndex = Integer.parseInt(requestParameterMap.get("relation_index"));

Relation newRelation = attribute.getRelation().getSchema().getRelations().get(relationIndex);
attribute.getRelation().removeAttribute(attribute);
newRelation.addAttribute(attribute);

для обновления нового компонента таблицы. Я добавляю его id для выполнения и рендеринга идентификаторов

FacesContext.getCurrentInstance().getPartialViewContext().getRenderIds().add(relationBlockId);
FacesContext.getCurrentInstance().getPartialViewContext().getExecuteIds().add(relationBlockId);

, но компонент не сохраняет ввод пользователя для обновления таблицы, поскольку этап обновления модели уже пройден .

Вопрос : Могу ли я добавить новый компонент таблицы в список выполнения до этапа обновления модели или, может быть, я могу принудительно выполнить его?

PS , если я изменяю сигнатуру commandScript на

<h:commandScript name="change_relation"
                 execute="@form"
                 render="${cc.parent.clientId}:relation-block"
                 action="${attributeController.changeRelation(cc.attrs.attribute)}">
</h:commandScript>

перетаскивание работает правильно, но я хочу обновить только два компонента таблицы для минимизации выполняемых компонентов

...