Основа диалога Primefaces не работает при использовании слушателя ajax

Я пытаюсь открыть диалог с помощью диалоговой рамки Primefaces 4,

public void openDialog(String viewName) {
  RequestContext.getCurrentInstance().openDialog(viewName);
}

Это работает:

<p:commandButton value="Click" action="#{impaktDialogBean.openDialog('/popup/test2')}"/>

Это не:

<p:commandButton value="Click">     
  <p:ajax event="click" listener="#{impaktDialogBean.openDialog('/popup/test2')}" ></p:ajax>
</p:commandButton>

Таким образом, диалоговая структура Primefaces работает только с action & actionListener?????

Я использую:

  • Primefaces 4
  • Tomcat 7
  • JSF 2.2.6 Мохарра

Благодарю.

3 ответа

Я знаю, что вопрос был задан давно, но на будущее...

Как насчет <p:remoteCommand>?

<p:remoteCommand name="remoteCmd" update="anything" actionListener="#{impaktDialogBean.openDialog('/popup/test2')}" />

<p:commandButton value="Click" update="anything" onclick="remoteCmd()" >

Другой подход для достижения вызова JavaScript для вашего компонента.

Самое простое решение, которое я нашел, - запустить кнопку с помощью JavaScript.

Кнопка, которая открывает диалог (возможно, скрытый):

<p:commandButton id="myButton" action="#{bean.openMyDialog}" style="display:none" />

Событие ajax, которое "щелкает" по кнопке:

<p:ajax ... oncomplete=" $('#myButton').click() " />

У вас есть это:

public void openDialog(String someView) {
    RequestContext.getCurrentInstance().openDialog(someView);
}

Итак, когда вы делаете это:

<h:form id="form">
    <p:commandButton id="button" value="Click" actionListener="#{bean.openDialog('someView')}" />
</h:form>

Вы получаете это в своем ответе Ajax:

PrimeFaces.openDialog({
    url:'/some/address/view.xhtml',
    pfdlgcid:'cf8e7955-a6cf-4dd8-9a07-55cd29696a64',
    sourceComponentId:'form:button',
    sourceWidget:PF('widget_form_button'),
    options:{}});

Итак, вы можете попробовать это:

<h:form id="form">
    <p:commandButton id="button" value="Click" onclick="PrimeFaces.openDialog({
        url:'/some/address/view.xhtml',
        pfdlgcid:'cf8e7955-a6cf-4dd8-9a07-55cd29696a64',
        sourceComponentId:'form:button',
        sourceWidget:PF('widget_form_button'),
        options:{}});" />
</h:form>

Вы даже можете использовать возвращаемое значение:

<h:form id="form">
    <p:growl id="growl" showDetail="true" />

    <p:commandButton id="button" value="Click" onclick="PrimeFaces.openDialog({
        url:'/some/address/view.xhtml',
        pfdlgcid:'cf8e7955-a6cf-4dd8-9a07-55cd29696a64',
        sourceComponentId:'form:button',
        sourceWidget:PF('widget_form_button'),
        options:{}});">

        <p:ajax event="dialogReturn" listener="#{bean.returnedValue}" update="growl" />
    </p:commandButton>
</h:form>

AJAX просто для того, чтобы превратить результат в URL назначения. Если у вас уже есть URL-адрес назначения, вам не нужно это делать. В моих основных тестах это работает хорошо, точно так же, как оригинал, за исключением того, что вы должны передать адрес назначения в поле 'url', а не результат.

Надеюсь это поможет.

Другие вопросы по тегам