2017-02-13 14 views
0

У меня проблема с Аккордеонной панелью. Я аккордеона похож на это:Как предотвратить совпадение панели аккордеона при использовании кнопки, добавленной в заголовок?

<p:accordionPanel> 
    <p:tab title="tabTitle"> 
     <f:facet name="title"> 
      <!-- problematic button --> 
      <p:commandButton value="button"/> 
     </f:facet> 
     <h:PanelGrid> 
      <p>Accordion content</p> 
     </h:panelGrdi> 
    </p:tab> 
</p:accordionPanel> 

Проблема - при нажатии на кнопку, весь Аккордеон Tab разрушится.

Мой вопрос: Как предотвратить аккордеон от рутинного нажатия кнопки? В то же время я бы хотел, чтобы Accordion рухнул, когда я нажимаю на заголовок, но за пределами кнопки.

Я использую PrimeFaces 5.3 и JSF 2.2.11

+1

Это немного сложнее. Проблема здесь в том, что у аккордеона есть связанное с ним событие щелчка, а кнопка, находящаяся внутри аккордеона, наследует эту привязку, это будет трюк. Здесь я вижу два варианта: 1 - вы создаете слой за пределами аккордеона, поместите на него кнопку и программно поместите его поверх аккордеона. 2- Измените код, чтобы не распространять событие клика на кнопке. –

+0

вы хотите открыть его, даже если вы нажмете на другой элемент ??? –

+0

@JorgeCampos - знаете ли вы, может быть, как я могу добиться эффекта нераспространения события click? –

ответ

0

Как был предложен @JorgeCampos - мы можем использовать event.stopPropagation() для того, чтобы предотвратить событие «пузырь» от кнопки к аккордеону. Использование для кода сообщения в вопросе будет выглядеть следующим образом:

<p:accordionPanel> 
    <p:tab title="tabTitle"> 
     <f:facet name="title"> 
      <p:commandButton value="button" onclick="event.stopPropagation();"/> 
     </f:facet> 
     <h:PanelGrid> 
      <p>Accordion content</p> 
     </h:panelGrdi> 
    </p:tab> 
</p:accordionPanel> 

Мы можем, конечно, использовать другие события, чтобы сделать что-то другое, или использовать actionListener для вызова метода из ManagedBean, используйте update. Например

<p:commandButton 
    value="button" 
    onclick="event.stopPropagation();" 
    oncomplete="PF('someDialog').show();" <!-- open dialog by js --> 
    actionListener="#{someBean.someMethod}" <!-- call java method --> 
    update="someComponent" <!-- update component --> 
/> 

распространения останавливая событие не будет мешать

0

разрывания все события ваших заголовков, а затем связать их снова вызвав init метод компонента.

<p:accordionPanel widgetVar="myAccordion"> 
    <p:tab title="tabTitle"> 
    <f:facet name="title"> 
     <!-- problematic button --> 
     <p:commandButton value="button" 
      onclick="PF('myAccordion').jq.find('.ui-accordion-header').unbind()" 
      oncomplete= "PF('myAccordion').init(PF('myAccordion').cfg)"/> 
    </f:facet> 
    <h:PanelGrid> 
     <p>Accordion content</p> 
    </h:panelGrdi> 
    </p:tab> 
</p:accordionPanel> 
+0

Большое спасибо за это решение, я его протестировал, и он работает, но я нашел (согласно комментариям ниже вопросительного поста) гораздо более простое решение с использованием 'event.stopPropagation()' in ' onclick' action –

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

  • Нет связанных вопросов^_^