송신 후 검증 에러가 발생했을 경우, 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 && !args.validationFailed) PF('yourWidgetVarName').hide()" />
그if (args)체크가 필요한 이유는 ajax 에러가 발생했을 때 체크가 없을 수 있기 때문에 취득하려고 하면 새로운 JS 에러가 발생할 수 있기 때문입니다.validationFailed그것으로부터,&대신&이 답변에서 설명하는 이유로 필수입니다.필요에 따라 다음과 같이 호출하는 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 && 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
'programing' 카테고리의 다른 글
| WooCommerce REST API에서 "리소스를 나열할 수 없습니다" 오류가 발생했습니다. (0) | 2023.03.01 |
|---|---|
| 로컬 json 파일에 데이터를 쓸 수 있는 것은 angular만 있으면 됩니다. (0) | 2023.03.01 |
| 날짜 개체를 사용하는 구성 요소는 시간대별로 서로 다른 스냅샷을 생성합니다. (0) | 2023.03.01 |
| ACF 관계 필드 - 다른 포스트 유형의 get_field 값 (0) | 2023.03.01 |
| JavaScript 라이브러리를 위한 최고의 LINQ는 무엇입니까? (0) | 2023.03.01 |