#primefaces #contextmenu #jsf-2.2
#основные области #контекстное меню #jsf-2.2
Вопрос:
помогите мне, пожалуйста!!!
На моей странице у меня есть две части:
- часть «меню», где я использую TreeNode в качестве выбора.
- вторая часть «центральная», где я показываю страницу каждый раз, когда выбирается узел.
Просто все работает гладко.
Проблемы начались, когда я связал TreeNode с ContextMenu. Каждый раз, когда я щелкаю правой кнопкой мыши на узле, чтобы просмотреть мое контекстное меню, оно показывает время загрузки моей центральной страницы. Похоже, что щелкните правой кнопкой мыши и выберите neoud в замешательстве, и тот, кто возьмет на себя управление, выберет узел.
Возможно ли разделить эти два события?
Возможно ли поступить иначе или есть обходной путь?
Найденный мной обходной путь заключается в размещении командной ссылки под каждым узлом. это не сработало, особенно для дочерних узлов.
Спасибо за вашу помощь
<h:form id="formMenuAdmin" >
<p:panel header="Domaines" id="panelDomaines" style="border: none;width: auto" >
<p:contextMenu for="treeMenuAdmin" id="contextMenuTreeNodeDomaine" nodeType="Domaine">
<p:menuitem id="menuitemAdd" value="Créer " icon="ui-icon-search" actionListener="#{domaineCtrl.afficherDialogOrg('dialogCreateDgdsVar')}">
</p:menuitem>
<p:menuitem id="menuitemEdit" value="Editer" icon="ui-icon-search">
</p:menuitem>
<p:menuitem id="menuitemUpdate" value="Modifier" icon="ui-icon-search">
</p:menuitem>
<p:menuitem id="menuitemDelete" value="Supprimer" icon="ui-icon-search">
</p:menuitem>
</p:contextMenu>
<p:contextMenu for="treeMenuAdmin" id="contextMenuTreeNodeSousDomaine" nodeType="Dss">
<p:menuitem id="menuitemAddDss" value="Créer"
icon="ui-icon-search"
actionListener="#{domaineCtrl.afficherDialogOrg('dialogCreateDss')}">
</p:menuitem>
<p:menuitem id="menuitemEditDss" value="Editer"
icon="ui-icon-search" actionListener="#">
</p:menuitem>
<p:menuitem id="menuitemUpdateDss" value="Modifier "
icon="ui-icon-search" actionListener="#">
</p:menuitem>
<p:menuitem id="menuitemDeleteDss" value="Supprimer"
icon="ui-icon-search" actionListener="#">
</p:menuitem>
</p:contextMenu>
<p:tree id="treeMenuAdmin" value="#{treeNodeCtrl.rootTreeNode}"
var="doc" selectionMode="single"
selection="#{treeNodeCtrl.selectedTreeNode}"
style="width: auto;border: none" cache="true" >
<p:ajax event="select" listener="#{treeNodeCtrl.onNodeSelect()}" />
<p:treeNode id="treeNodeDomaine" type="Domaine"
expandedIcon="ui-icon-folder-open"
collapsedIcon="ui-icon-folder-collapsed">
<h:outputText value="#{doc.nom}" id="outputTextDomaine#{doc}"/>
</p:treeNode>
<p:treeNode id="treeNodeDss" type="Dss" >
<h:outputText value="#{doc.nom}" id="outputTextDss" />
</p:treeNode>
</p:tree>
</p:panel>
</h:form>
Комментарии:
1. Можете ли вы показать нам контекстное меню для «центральной» части?
2. @rion18, у меня нет никакого контекстного меню на центральной странице. Я думаю, что я плохо объяснил проблему: центральная страница просто отображает содержимое выбранного узла (узел, выбранный в меню страницы).
3. Хорошо, я понял. Когда вы щелкаете правой кнопкой мыши узел, чтобы вызвать контекстное меню, затем этот узел выбирается, это поведение PrimeFaces по умолчанию. Однако в версии PF 5.0 (начиная с версии PF 4.0.2)
SelectTreeNodeEvent
был обновлен и включенisContextMenu()
метод. Вы можете увидеть это здесь . Возможен ли переход на PF 5.0?4. Да, я могу. Итак, решение состоит в том, чтобы просто переключиться на PF5.0? Ничего не меняя в моем коде, если я вас понимаю.
Ответ №1:
Переключение на PF 5.0 позволит вам использовать isContextMenu
метод. Единственное отличие, которое это повлечет за собой, заключается в следующем, в вашем onNodeSelect
методе.
public void onNodeSelect(NodeSelectEvent event){
if (!event.isContextMenu()){
//original code here.
}
}
Таким образом, ваш исходный код выбора будет выполнен, если контекстное меню НЕ вызвано.
Комментарии:
1. неплохо. не знал, что здесь есть этот метод. 😀 спасибо!