2

JSF 2.1 web アプリでは、commandButton を含む dataTable の列があります。commandButton によってトリガーされるアクションは、エラーをスローする場合があります。エラーがスローされない場合はダイアログを開き、それ以外の場合はエラーメッセージを含むボックスを開きたい.

JSF

<h:form>
    <p:dataTable var="foo" value="#{myBean.foos}" >
        <p:column>#{foo.id}</p:column>
        <p:column>
            <p:commandButton title="Action" action="#{myBean.action()}" onComplete="handleResult(xhr, status, args)" >
                <f:setPropertyActionListener value="#{foo}" target="#{myBean.selectedFoo}" />
            </p:commandButton>
        </p:column>
    </p:dataTable>
</h:form>

JavaScript

function handleRequest(xhr, status, args) {
    if (!args.success) {
        displayBox(args.errorMsg);
    } else {
        displayDialog();
    }
}

マイビーン

@ManagedBean
@ViewScoped
public class MyBean {
    private List<Foo> foos;
    private Foo selectedFoo;

    public void action() {
        try {
            // business logic
        } catch (Exception ex) {
            RequestContext rContext = RequestContext.getCurrentInstance();
            rContext.addCallbackParam("success", false);
            rContext.addCallbackParam("errorMsg", ex.getMessage());
        }
    }
}

私が考えることができる唯一の解決策は、PrimeFaces を使用しRequestContext.callBackParam()、それを読み取って何を開くかを決定する JS 関数を作成することです。

もっとスムーズな方法はありますか?可能であれば、検証の概念を活用することを検討したいと思いますが、JS でエラーをインターセプトする方法の例が見つかりません。

4

1 に答える 1

2

標準的な方法は、グローバルな顔のメッセージを追加するだけです (したがって、nullクライアント ID を使用)。

public void action() {
    try {
        // business logic
    } catch (Exception ex) {
        context.validationFailed();
        context.addMessage(null, new FacesMessage(
            FacesMessage.SEVERITY_ERROR, ex.getMessage(), null));
    }
}

(呼び出しFacesContext#validationFailed()により#{facesContext.validationFailed}EL が評価されtrueます。これは通常、の場合に設定されますValidatorException)

次に、グローバル メッセージのみのボックスを表示するには、 を使用します<p:messages globalOnly="true">

<p:messages globalOnly="true" autoUpdate="true" />

結果が成功したときにダイアログを表示するには、ポストバック成功し たときにレンダリングします。

<p:outputPanel autoUpdate="true">
    <p:dialog visible="true" rendered="#{facesContext.postback and not facesContext.validationFailed}">
        A successful postback is performed!
    </p:dialog>
</p:outputPanel>

特定のボタンが押されたときにのみトリガーされるように、必要autoUpdate="true"に応じて一方または両方のコンポーネントを置き換えます。update="messagesId dialogPanelId"

于 2013-01-04T13:02:44.920 に答える