У меня есть дерево PrimeFaces (6.2.5), где я включил перетаскивание и сброс. У меня есть несколько проблем с этим, и я реализовал перетаскивание вручную с помощью jquery вместо этого, пока я это выяснил;
<div class="plantree" id="realplantree">
<p:tree id="plantree" value="#{curriculumngTreeFacade.root}" var="node" dynamic="false" selectionMode="single" selection="#{curriculumngTreeFacade.selectedNode}" draggable="true" droppable="true">
<p:ajax event="select" listener="#{curriculumngTreeFacade.onNodeSelect}" update="administration-form:curriculummain" oncomplete="initDNDPlan();"/>
<p:ajax event="expand" listener="#{curriculumngTreeFacade.onNodeExpand}" />
<p:ajax event="collapse" listener="#{curriculumngTreeFacade.onNodeCollapse}" />
<p:ajax event="dragdrop" listener="#{curriculumngTreeFacade.onDragDrop}"/>
<p:treeNode expandedIcon="ui-icon ui-icon-folder-open" collapsedIcon="ui-icon ui-icon-folder-collapsed">
<h:outputText value="#{node}"/>
</p:treeNode>
</p:tree>
</div>
Мои проблемы:
- Я не добавил переменную "update = 'plantree'" в событие p: ajax
для перетаскивания. Даже если я попытаюсь перетащить родительскую категорию в
подкатегория, это ломает мое дерево, потому что пользовательский интерфейс пытается обновить. я
на самом деле запустить проверку родительского / дочернего соединения в бэкэнде
код, и я не обновляю дерево, если это так, но в этом
В этом случае мой метод в компоненте поддержки даже не вызывается до
дерево взрывается. Он делает то же самое на PrimeFaces Showcase
Код поддержки:
public void onDragDrop(TreeDragDropEvent event) throws Exception {
TreeNode dragNode = event.getDragNode();
TreeNode dropNode = event.getDropNode();
int dropIndex = event.getDropIndex();
if (dragNode.getData() instanceof CurriculumCategoryMetaModel && dropNode.getData() instanceof CurriculumCategoryMetaModel) {
CurriculumCategoryMetaModel drop = (CurriculumCategoryMetaModel) dropNode.getData();
CurriculumCategoryMetaModel drag = (CurriculumCategoryMetaModel) dragNode.getData();
if (drop.getType() == drag.getType() && drag.getClassid() > 0) {
drag.setParent(drop);
CurriculumBuilderProvider provider = CurriculumBuilderProvider.getProvider(drop.getType());
provider.saveCategory(drag, UserSessionFacade.getUserLocale());
this.initialize();
expandCategory(root, drop.getClassid(), drop.getType());
} else {
this.initialize();
}
}
FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Dragged " + dragNode.getData(), "Dropped on " + dropNode.getData() + " at " + dropIndex);
FacesContext.getCurrentInstance().addMessage(null, message);
List<String> updates = new ArrayList<>();
updates.add("administration-form:curriculummenu");
updates.add("administration-form:growl");
PrimeFaces.current().ajax().update(updates);
}
private boolean dragIsParentOfDrop(CurriculumCategoryMetaModel drop, CurriculumCategoryMetaModel drag) {
CurriculumCategoryMetaModel parent = drop.getParent();
while (parent != null) {
if (parent.getClassid() == drag.getClassid()) {
return true;
} else {
parent = parent.getParent();
}
}
return false;
}
- Есть ли способ добавить принятые узлы, в которые вы можете зайти. у меня есть 2
корневые узлы, для разных категорий, и не допускается перетаскивание
и упасть между ними. На самом деле, я даже не хочу, чтобы корневые узлы были
перетаскиваемый. На рисунке «Пути обучения» и «Ad hoc» не должны быть перетаскиваемыми, поскольку они являются только контейнерами для категорий внизу.