Primeface에서 fileUpload 컨트롤의 "선택"버튼을 클릭 할 때 업로드 할 파일을 선택하기 전에 양식에서 유효성 검사를 실행하고 싶습니다. 이것이 가능한가? 현재 사용자는 유효성 검사없이 "선택"및 "업로드"를 클릭 할 수 있습니다. 이로 인해 내 문서는 저장되지 않지만 첨부 파일이 생성됩니다. 양식을 성공적으로 확인하고 저장할 때까지 fileUpload 컨트롤을 숨길 수 있지만 가능한 경우 "선택"버튼을 클릭 할 때 유효성 검사를 호출하는 것이 좋습니다. onStart에서 remoteCommand 호출을 시도했지만 유효성 검사를 강제로 수행 할 수없는 것으로 보입니다.p : fileUpload - 업로드하기 전에 양식 유효성 검사
답변
p:fileUpload
자바 스크립트와 p:remoteCommand
을 결합하여 선택 버튼을 클릭하면 양식 유효성 검사를 트리거 할 수 있습니다.
기본 개념
- 차단 유효성 검사가 OK 인 경우
p:remoteCommand
완료가하고, 그렇지 않은 경우, 기본 결과 (파일 선택 대화 상자의 개방)를 방지하고 대신p:remoteCommand
을 실행 버튼을 클릭 이벤트를 선택 prevent 폼 입력 요소의 일부 데이터가 다시 변경 될 때까지 더 이상 버튼 클릭을 선택하지 마십시오. 개념 예제 코드의
증거는
이 페이지
<script>
var triggerValidation;
window.onload = function() {
//initially (after page is loaded) trigger validation on Choose btn click
triggerValidation = true;
//define button click listener
registerChooseBtnClick();
};
function registerChooseBtnClick() {
//var chooseBtn = document.getElementsByClassName("ui-fileupload-choose")[0];
// or if you define p:upload widgetVar you can use PF function
var chooseBtn = PF('fileUploadWidget').chooseButton[0];
chooseBtn.addEventListener('click', fnRef, false);
}
var fnRef = function (event) {
console.log("Button clicked");
if (triggerValidation) {
//prevent file browser to open
event.preventDefault();
//trigger validation via p:remoteCommand;
submitSelection();
} else {
//File browser will be opened at this point
}
};
function checkIfValidationFailed(xhr, status, args) {
if (args) {
if (args.validationFailed) {
console.log("Validation failed");
triggerValidation = true;
} else {
triggerValidation = false;
}
}
}
//call each time when form input elements (inputText, ...) change value
function forceValidation(){
triggerValidation = true;
}
</script>
이 자바 스크립트을 추가하고 페이지를 추가 : 여기
<p:remoteCommand
name="submitSelection" process="@form"
oncomplete="checkIfValidationFailed(xhr, status, args)" resetValues="true"/>
또한 remoteCommand
<h:form id="form">
<p:messages autoUpdate="true"/>
<p:panelGrid columns="1">
<!--size is integer variable-->
<p:inputText id="size" maxlength="3"
value="#{yourBean.size}"
required="true" requiredMessage="Size is missing"
onchange="forceValidation();"/>
<p:fileUpload
id="upload"
widgetVar="fileUploadWidget"
fileUploadListener="#{yourBean.onUpload}"
multiple="true"
allowTypes="/(\.|\/)(jpg|png)$/" />
</p:panelGrid>
<p:remoteCommand
name="submitSelection" process="@form"
oncomplete="checkIfValidationFailed(xhr, status, args)" resetValues="true"/>
<p:commandButton
id="submitBtn" value="Sumbit" process="@form"
actionListener="#{yourBean.onSubmit()}"/>
</h:form>
<h:form id="form">
<p:messages autoUpdate="true"/>
<p:panelGrid columns="1">
<!--size is integer variable-->
<p:inputText id="size" maxlength="3"
value="#{yourBean.size}"
required="true" requiredMessage="Size is missing"
onchange="forceValidation();"/>
<p:fileUpload
id="upload"
widgetVar="fileUploadWidget"
fileUploadListener="#{yourBean.onUpload}"
multiple="true"
allowTypes="/(\.|\/)(jpg|png)$/" />
</p:panelGrid>
<p:remoteCommand
name="submitSelection" process="@form"
oncomplete="checkIfValidationFailed(xhr, status, args)" resetValues="true"/>
<p:commandButton
id="submitBtn" value="Sumbit" process="@form"
actionListener="#{yourBean.onSubmit()}"/>
</h:form>
감사합니다. 훌륭한 솔루션입니다! 내 문서에 읽기/편집 모드가있어 'on'버튼 이벤트가 '선택'버튼을 등록하지 못하게하는 약간의 문제가 있습니다. (업로드 컨트롤은 읽기 모드로 숨겨져 있습니다.) 그러나 나는 그 문제를 해결할 수 있습니다. – NeilC
나는 그것이 당신을 위해 일할지도 모르기 때문에 기쁘다. 이 경우 chooseBtn.removeEventListener를 사용하여 편집 모드로 전환 한 후 트리거를 등록하고 읽기 모드로 전환 한 후 등록을 취소 할 수 있습니다. –
또한이 답변을 유용하게 사용하는 경우 [누군가 내 질문에 대답하면 어떻게해야합니까?] (https://stackoverflow.com/help/someone-answers) :) –
bean에서 제어되는 "disabled"속성에서 부울 변수를 사용할 수 있으며 유효성 검사 후 업로드 구성 요소와이 변수를 업데이트합니다. –
안녕하세요 호르헤, 응답 해 주셔서 감사합니다. 사용자가 "선택"을 클릭했을 때 유효성 검사를 어떻게 호출 할 수 있습니까? 나는 그것이 첨부 파일을 업로드하기 전에 필요한 것에 대한 피드백을 사용자에게 제공하기 때문에 이런 식으로하고 싶다. – NeilC