programing

송신 후 검증 에러가 발생했을 경우, p:dialog를 열어 둡니다.

newnotes 2023. 3. 1. 11:29
반응형

송신 후 검증 에러가 발생했을 경우, p:dialog를 열어 둡니다.

최소 예제 대화 상자:

<p:dialog header="Test Dialog"  
          widgetVar="testDialog"> 
  <h:form> 
    <p:inputText value="#{mbean.someValue}"/> 

    <p:commandButton value="Save" 
                     onsuccess="testDialog.hide()" 
                     actionListener="#{mbean.saveMethod}"/> 
  </h:form>       
</p:dialog> 

mbean.save method는 어떤 문제가 발생했을 때 대화 상자가 닫히지 않도록 하고 growl을 통해서만 메시지를 출력할 수 있도록 하고 싶습니다.이는 백엔드 서버에 저장될 때까지 someValue가 유효한지 확인할 수 없기 때문에 검증자가 도움이 되지 않는 경우입니다.현재 이 작업은 가시 속성을 사용하여 수행하며 mbean 단위의 부울 필드를 가리킵니다.이것은 동작하지만, 다이얼로그의 기동이나 다운을 실시하려면 , 서버에 히트 할 필요가 있기 때문에, 유저 인터페이스가 느려집니다.

onsuccess에서는 액션 메서드가 정상적으로 호출된 경우가 아니라 Ajax 요청 자체가 성공한 경우(즉, 네트워크 오류나 수집되지 않은 예외 등이 없는 경우 등) 실행됩니다.

소정의 경우<p:dialog widgetVar="yourWidgetVarName">, 를 삭제할 수 있습니다.onsuccessPrime Faces로 대체한다.RequestContext#execute()안에서.saveMethod():

if (success) {
    RequestContext.getCurrentInstance().execute("PF('yourWidgetVarName').hide()");
}

주의:PF()는 PrimeFaces 4.0에서 도입되었습니다.이전 버전의 PrimeFaces에서는yourWidgetVarName.hide()대신.

뷰 고유의 스크립트로 컨트롤러를 복잡하게 만들지 않으려면oncomplete그 대신, 이것은args부울이 있는 객체validationFailed속성:

<p:commandButton ...
    oncomplete="if (args &amp;&amp; !args.validationFailed) PF('yourWidgetVarName').hide()" />

if (args)체크가 필요한 이유는 ajax 에러가 발생했을 때 체크가 없을 수 있기 때문에 취득하려고 하면 새로운 JS 에러가 발생할 수 있기 때문입니다.validationFailed그것으로부터,&amp;대신&답변에서 설명하는 이유로 필수입니다.필요에 따라 다음과 같이 호출하는 JS 함수에 리팩터링합니다.oncomplete="hideDialogOnSuccess(args, 'yourWidgetVarName')"검증에 실패했을 경우, 「Keep open」<p:dialog >」를 참조해 주세요.

그러나 검증 오류가 없고 액션 방식이 정상적으로 트리거되었으며 서비스 메서드 호출의 예외 등의 이유로 대화 상자를 계속 열고 싶은 경우 수동으로 트리거할 수 있습니다.validationFailed로.true를 명시적으로 호출하여 backing bean 액션 메서드를 내부에서 실행합니다.

FacesContext.getCurrentInstance().validationFailed();

사용방법oncomplete명령 버튼의 속성 및 매우 간단한 스크립트가 도움이 됩니다.

대화상자와 명령어버튼은 다음과 같습니다.

<p:dialog widgetVar="dialog">
   <h:form id="dialogView">
       <p:commandButton id="saveButton" icon="ui-icon-disk"
           value="#{ui['action.save']}"
           update=":dataList :dialogView"
           actionListener="#{mbean.save()}"
           oncomplete="handleDialogSubmit(xhr, status, args)" />
   </h:form>
 </p:dialog>

스크립트는 다음과 같습니다.

<script type="text/javascript">
    function handleDialogSubmit(xhr, status, args) {
        if (args.validationFailed) {
            dialog.show();
        } else {
            dialog.hide();
        }
    }
</script>

나는 방금 이 해결책을 검색했다.기본적으로 버튼의 액션 대신 actionListener를 사용하는 것이 기본이며 backing bean에서는 callback 파라미터를 추가하여 버튼의 oncomplete 메서드를 체크인합니다.샘플 부분 코드:

먼저 JSF:

<p:commandButton actionListener="#{myBean.doAction}"
   oncomplete="if (!args.validationFailed &amp;&amp; args.saved) schedulesDialog.hide();" />

백킹빈:

public void doAction(ActionEvent actionEvent) {
    // do your stuff here...
    if (ok) {
        RequestContext.getCurrentInstance().addCallbackParam("saved", true);
    } else {
        RequestContext.getCurrentInstance().addCallbackParam("saved", false);
    }
}

이것이 누군가에게 도움이 되기를 바랍니다:)

다음 솔루션을 사용합니다.

JSF 코드:

<p:dialog ... widgetVar="dlgModify" ... >
...
<p:commandButton value="Save" update="@form" actionListener="#{AdminMB.saveTable}" />
<p:commandButton value="Cancel" oncomplete="PF('dlgModify').hide();"/>

백업 빈 코드:

public void saveTable() {
    RequestContext rc = RequestContext.getCurrentInstance();
    rc.execute("PF('dlgModify').hide()");
}

저는 이것이 가장 깨끗한 해결책이라고 생각합니다.이렇게 하면 버튼 코드를 변경할 필요가 없습니다.이 솔루션은 숨기기 함수 프로토타입을 재정의합니다.

$(document).ready(function() {
    PrimeFaces.widget.Dialog.prototype.originalHide = PrimeFaces.widget.Dialog.prototype.hide; // keep a reference to the original hide()
    PrimeFaces.widget.Dialog.prototype.hide = function() {
        var ajaxResponseArgs = arguments.callee.caller.arguments[2]; // accesses oncomplete arguments
        if (ajaxResponseArgs && ajaxResponseArgs.validationFailed) {
            return;  // on validation error, prevent closing
        }
        this.originalHide();
    };
});

이렇게 하면 다음과 같이 코드를 유지할 수 있습니다.

<p:commandButton value="Save" oncomplete="videoDetalheDialogJS.hide();" 
   actionListener="#{videoBean.saveVideo(video)}" />

가장 쉬운 해결책은 클릭이나 온컴플리트 모두 "widget.hide"를 사용하지 않는 것입니다.숨기기 기능을 제거한 후

visible="#{facesContext.validationFailed}" 

대화상자 태그의 경우

언급URL : https://stackoverflow.com/questions/9195756/keep-pdialog-open-when-a-validation-error-occurs-after-submit

반응형