Primefaces p:ajax和remoteCommand不更新growl消息

时间:2016-07-22 23:22:13

标签: primefaces growl

在下面的示例中,我使用p:ajax修改数据表,然后使用remoteCommand更新表。这样可行。但是,我还想在发生错误或成功时更新growl消息。这不起作用。

我从示例中看到一个按钮是否调用了一个动作,然后调用remoteCommand,即growl msgs更新。但是,这不能从数据表中的ajax cellEdit给出我需要的东西。

如何从p:ajax命令更新growl消息。

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:p="http://primefaces.org/ui"
>

<h:head/>

<h:form id="formId">

    <p:growl id="msgs" showDetail="true" />
    <h:body>
        <h:panelGrid>
            <!-- Updates wordsId table but not msgs -->
            <p:remoteCommand name="onCellEditRemote" update="wordsId msgs"/>

            <p:dataTable id="wordsId" var="word" value="#{remoteMessageBean.words}" editable="true" editMode="cell">
                <!-- does not update msgs -->
                <p:ajax event="cellEdit" listener="#{remoteMessageBean.modifyWordOnCellEdit}"  oncomplete="onCellEditRemote()" update="formId:msgs"/>

                <p:column headerText="Modify" >
                    <p:outputLabel value="#{word}" />
                </p:column>
                <p:column headerText="Modify" >
                    <p:cellEditor>
                        <f:facet name="output"><h:outputText value=""/></f:facet>
                        <f:facet name="input">
                            <p:inputText id="modelInput" value="#{remoteMessageBean.modifyWord}"/>
                        </f:facet>
                    </p:cellEditor>
                </p:column>
            </p:dataTable>
        </h:panelGrid>

        <p:remoteCommand name="rc" update="msgs" />
        <p:commandButton type="button" action="#{remoteMessageBean.buttonAction}" value="Doesnt Work" icon="ui-icon-refresh" update="msgs" />

        <p:remoteCommand name="rc2" update="msgs" action="#{remoteMessageBean.buttonAction}" />
        <p:commandButton type="button" onclick="rc2()" value="Works" icon="ui-icon-refresh" />


    </h:body>
</h:form>
</html>



@ManagedBean
@SessionScoped
public class RemoteMessageBean {
    private static Logger logger = Logger.getLogger(RemoteMessageBean.class);
    private String modifyWord;
    private List<String> words;

    public RemoteMessageBean() {
        words = new ArrayList<>();
        words.add("word1");
        words.add("word2");
        words.add("word3");
    }

    public void modifyWordOnCellEdit(CellEditEvent event) {
        logger.debug(event);
        getWords().add(getModifyWord());
        logger.debug("");
        FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "adding " + getModifyWord(), null);
        FacesContext.getCurrentInstance().addMessage(null, msg);
        setModifyWord(null);
    }

    public void buttonAction() {
        logger.debug("");
        FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "buttonAction", null);
        FacesContext.getCurrentInstance().addMessage(null, msg);
      }

    public String getModifyWord() {
        return modifyWord;
    }

    public void setModifyWord(String modifyWord) {
        this.modifyWord = modifyWord;
    }

    public List<String> getWords() {
        return words;
    }

}

2 个答案:

答案 0 :(得分:0)

我通过在modifyWordOnCellEdit中创建和保存消息然后从remoteCommand调用displayMessageAction来显示它来解决这个问题。不完全是我所希望的,但它有效。

Jsf Page

 <p:remoteCommand name="onCellEditRemote" update="wordsId" action="#{gameBean.displayMessageAction}"/>

<强>控制器

   public void displayMessageAction() {
        if (getMessage() != null) {
            FacesContext.getCurrentInstance().addMessage("growl", getMessage());
            setMessage(null);
        }
    }

    public void modifyWordOnCellEdit(CellEditEvent event) {
    ...
        FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, exception.getMessage(), null);
        setMessage(msg);
    }

答案 1 :(得分:-2)

它的工作原理是在p:ajax

中添加partialsubmit