2016-12-15 2 views
1

Я создал в контекстном меню проекта после щелчка правой кнопкой мыши. Модель меню создана на Java. В XHTML У меня есть только:Получить значение после щелчка правой кнопкой мыши в контекстном меню PrimeFaces

<p:panelMenu style="width:250px" id="menu" 
      model="#{menuBean.menuModel}" stateful="false"> 
     </p:panelMenu> 

<p:contextMenu id="context" for="menu" 
       model="#{menuBean.contextMenuModel}" style="width:300px"> 

Я хочу, чтобы получить значение или идентификатор из пункта при нажатии на него правой кнопкой мыши. Как это сделать в PrimeFaces? Я нашел ответ только для использования таблицы данных. Я использовал в проектах JSF и PrimeFaces.

EDIT: Я написал простой JQuery, как это:

$(".ui-menuitem-link").contextmenu(function() { 
    document.getElementById("hiddenField").value = $(this).text(); 
}); 

Он возвращает имя выбранного элемента, но, возможно, кто-то есть лучшее решение без JQuery.

+0

Вы пытались добавить '' на ваш palenMenu?!? –

+0

@YagamiLight Когда я пытаюсь это сделать, у меня есть ошибка: 'Невозможно приложить поведение к non-ClientBehaviorHolder parent' – DanteVoronoi

+0

, это хорошая просьба подождать секунду, и я дам ответ и попытаюсь объяснить его –

ответ

1

Чтобы выполнить что-то подобное, что сначала нужно сделать ваш Контекстное внутри элемента и обязательно что-то identifie ваши данные (информация)

Давайте посмотрим на этот пример

Первый пример: Дерево

<p:tree id="tree" value="#{ManagedBean.treeConstruct}" var="node" ...> 
<p:ajax event="contextMenu" listener="#{ManagedBean.onContextMenu}"  /> 
...  
</p:tree> 

и в managedBean вы нашли

public void onContextMenu(NodeSelectEvent event) { 

    System.out.println(" event " + event.getTreeNode().getRowKey()); 

} 

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

Второй пример: DataGrid

<p:dataGrid var="car" ...> 
    <p:contextMenu for="element" id="test" > 
    <p:menuitem icon="ui-icon-plus" ... > 
     <f:setPropertyActionListener value="#{car}" target="#{ManagedBean.nodeSelected}" />         
          </p:menuitem> 

    </p:contextMenu> 
</p:dataGrid> 

Вы видите, что вещь Var в commente с двумя например

+0

@DanteVoronoi wait, я улучшу свой ответ –

+0

так что это невозможно сделать в меню панели? – DanteVoronoi

+0

@DanteVoronoi Я пытаюсь дать ответ об этом вопросе, поэтому я сказал: «Подожди, я улучшу свой ответ» –

3

p:contextMenu имеет атрибут beforeShow, который может быть использован для огня клиента -side javascript (как это можно прочитать в документации).

У этого также есть targetFilter, чтобы стрелять только по определенным элементам внутри 'for'. Если вы даете вашу форму явного идентификатора (например, Myform), вы можете иметь его стрелять только по ссылкам пункт меню:

<p:contextMenu for="menu" targetFilter="#myForm\\:menu .ui-menuitem-link" beforeShow="..."> 

Вы можете, например, сделайте console.log(this) или console.log(event), и от тех, кто проверяет, в чем вы нуждаетесь и имеете доступ, много.

«this» в контексте contextMenu имеет свойство jqTarget, которое получит вам компонент html, который был запущен contextMenu для (меню), но вы также можете использовать объект события, у которого есть цель, которая является конкретной пункт меню.

<p:contextMenu for="menu" targetFilter="#myForm\\:menu .ui-menuitem-link" beforeShow="console.log(this); console.log(event)"> 

даст вам выход как

Object { _super: undefined, cfg: Object, id: "myForm:j_idt118", jqId: "#myForm\:j_idt118", jq: Object, widgetVar: "widget_myForm_j_idt118", keyboardTarget: Object, links: Object, rootLinks: Object, jqTargetId: "#myForm\:menu", 1 meer… } panelMenu.xhtml:655:174 
Object { originalEvent: contextmenu, type: "contextmenu", isDefaultPrevented: returnFalse(), target: <a.ui-menuitem-link.ui-corner-all.ui-state-hover>, currentTarget: <div#myForm:menu.ui-panelmenu.ui-widget>, relatedTarget: null, timeStamp: 103942249, jQuery31004030775514688282: true, delegateTarget: HTMLDocument → panelMenu.xhtml, handleObj: Object, 1 meer… } 

Так что вам нужно JavaScript, чтобы добраться до реальной стоимости, что вам нужно, вы просто не нужны пользовательские JQuery.

Поскольку я не знаю, где находится ваше скрытое поле, я не могу включить это в свой ответ. Извините

+0

Я пробую метод со скрытым вводом, и это хорошо работает. Спасибо за помощь. – DanteVoronoi

+0

Вы говорите, что мой ответ помог? Или вы используете свой jquery? Если ответ помог, вам будет предложено «принять» его. Если бы это помогло, вы даже можете его продвинуть. Если это не помогло, вы можете уменьшить ответ. Другие тогда знают, что этот ответ был не очень хорош – Kukeltje

+0

Я использую мой 'JQuery', но я думаю, что ваш ответ хорош и может быть полезен для тех, кто ищет решение этой проблемы. – DanteVoronoi

Смежные вопросы