2012-06-19 4 views
0

Я использую Primefaces 3.3.1 и задаю вопрос.Как открыть меню наложения из oncomplete p: commandButton with Primefaces?

У меня есть p: commandButton внутри p: столбец p: данныеTable. Я могу показать меню наложения при нажатии кнопки с помощью xhtml, показанного ниже.

<p:commandButton id="btnID" icon="ui-icon-circle-triangle-s" style="height: 16px;"> 
     <f:setPropertyActionListener value="#{searchItem}" target="#{bean.selectedSearchItem}" /> 
    </p:commandButton> 
    <p:slideMenu overlay="true" trigger="btnID" my="left top" at="left bottom" 
      model="#{bean.menuModel}"/> 

В этом случае bean.menuModel может мгновенно вернуть данные меню. Но у меня есть еще один случай, когда требуется предварительная обработка, чтобы готовить данные меню. Поэтому у меня тоже есть этот.

<p:commandButton ajax="true" id="historyButton" action="#{bean.getHistory()}" 
     icon="ui-icon-note" style="height: 16px;" 
     onstart="workingDialog.show();" 
     oncomplete="workingDialog.hide(); historyMenu.show();"> 
     <f:setPropertyActionListener value="#{searchItem}" target="#{bean.selectedSearchItem}" /> 
    </p:commandButton> 
    <p:menu overlay="true" widgetVar="historyMenu" my="left top" at="left bottom" 
      model="#{searchBean.menuModel}"/> 

Я имел в виду, когда кнопка нажата, она вызывает bean.getHistory(), который начинает загрузку данных меню для этой строки, и показать модальный диалог с кружась значком. По завершении загрузки диалог исчезнет, ​​и появится меню наложения. То, что я не могу сделать, - последняя часть этого сценария. Выше кода срабатывает исключение.

java.lang.NullPointerException 
    javax.faces.component.UIComponentBase.findComponent(UIComponentBase.java:561) 
    org.primefaces.component.menu.BaseMenuRenderer.encodeOverlayConfig(BaseMenuRenderer.java:138) 
    org.primefaces.component.menu.MenuRenderer.encodeScript(MenuRenderer.java:45) 
    org.primefaces.component.menu.BaseMenuRenderer.encodeEnd(BaseMenuRenderer.java:39) 
    javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:875) 
    javax.faces.component.UIComponent.encodeAll(UIComponent.java:1763) 
    javax.faces.component.UIComponent.encodeAll(UIComponent.java:1759) 

Код, показанный ниже, отлично работает без кода, связанного с кодом.

<p:commandButton ajax="true" id="historyButton" action="#{searchBean.getHistory()}" 
     icon="ui-icon-note" style="height: 16px;" 
     onstart="workingDialog.show();" 
     oncomplete="workingDialog.hide();"> 
     <f:setPropertyActionListener value="#{searchItem}" target="#{bean.selectedSearchItem}" /> 
    </p:commandButton> 

Я думаю, это простой вопрос для экспертов. Как открыть меню наложения из неполного?

Заранее спасибо.

ответ

0

Не удалось найти решение этой проблемы, но я пришел к выводу, что то, что я хотел сделать, - это не очень хорошая идея с окружающей средой, над которой я работаю.

Во-первых, я заметил, что меню получает данные из bean-компонента, когда заполняется строка таблицы данных, а не когда отображается меню. И нет никакого ленивого механизма загрузки для меню. Таким образом, нажатие кнопки -> получение данных для меню с сервера -> открытое меню не может быть выполнено, как я ожидал (по крайней мере, мне кажется).

Во-вторых, я заметил, что класть меню в DataTable (под TabView в моем случае) вызывает очень странную проблему. Когда я обновляю DataTable, некоторые связанные с ajax функции перестают работать. Я не могу объяснить эту проблему, чтобы вы поняли или поверили, но приложение, над которым я работаю, испытывает эту проблему.

Итак, я отказался от ввода меню в DataTable в своем приложении. Спасибо за Ваше внимание.

Я принимаю этот ответ, чтобы не понизить ставку уже ниже.

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