2017-02-17 2 views
4

에서 관리 빈에서 반환 된 값을 취득 나는 p:remoteCommand는 다음과 같은 checkPageLayoutsAreSelected라는 호출하는 자바 스크립트 이벤트를 호출내 응용 프로그램에서 자바 스크립트

$('selector').on('click', function (e) { 
    checkPageLayoutsAreSelected(); 
}); 

이것은 p:remoteCommand입니다 :

<p:remoteCommand name="checkPageLayoutsAreSelected" actionListener="#{beanFormDashboard.checkPageLayoutsAreSelected}" /> 

p:remoteCommand 부울 값

01을 리턴하는 beanFormDashboard 관리 Bean의 메소드를 호출합니다.

그래서 자바 빈 코드의 관리 빈에서 checkPageLayoutsAreSelected()에 의해 반환 된 값을 가져 오려고합니다. 이 같은

뭔가 :

$('selector').on('click', function (e) { 
    var returnedValue = checkPageLayoutsAreSelected(); 
}); 

내가 어떻게 할 수 있습니까?

답변

3

checkPageLayoutsAreSelected 값이나 심지어 약속을 반환하지 않지만 Ajaxicaly 반환 값을 사용할 수 있습니다.

$('selector').on('click', function (e) { 
    checkPageLayoutsAreSelected(); 
    window.getLayoutAreSelectedResult= function(xhr, status, args) { 
     var returnedValue = args.returnedValue; 
     console.log(returnedValue); 
    } 
}); 
:
public void checkPageLayoutsAreSelected() { 
    Boolean result=true; 
    for(DashboardPage dp : dashboardPageList){ 
     if(dp.getModel() == 0){ 
      result= false; 
     } 
    } 
    RequestContext reqCtx = RequestContext.getCurrentInstance();   
    reqCtx.addCallbackParam("returnedValue", result); 
} 

그리고 자바 스크립트 콜백 함수 getLayoutAreSelectedResult(xhr, status, args)에서

당신이 반환 값을가집니다 :
<p:remoteCommand name="checkPageLayoutsAreSelected" 
    action="#{beanFormDashboard.checkPageLayoutsAreSelected()}" 
    oncomplete="getLayoutAreSelectedResult(xhr, status, args);" 
/> 

그리고 당신은 클라이언트로 결과를 보내 PF에서 제공 RequestContext를 사용 checkPageLayoutsAreSelected() 방법에

+0

고마워,하지만 내 경우에는 작동하지 않는이 접근 방식을 알고 있으므로, 원하는 경우 이벤트 함수 내에'returnedValue'를 가져 오는 것이 좋습니다.이 경우에는 글로벌 자바 내 자바 코드에서 누른 다음 getLayoutAreSelectedResult getValue'를 전역 변수에 할당합니다. getLayoutAreSelectedResult는 이벤트 함수가 끝난 후에 실행되므로 작동하지 않을 것입니다. 클릭 이벤트가 다시 발생 될 때까지 'returnedValue'를 볼 수 있습니다. 이는 첫 번째 클릭 이벤트에 대한 이전 반환 값입니다. –

+0

안녕하세요 @AimadMAJDOU, 제 답변을 수정 했습니까? – fingerpich

+0

감사합니다. –

0

다른 대답은 작동하고 u는 완전한 xhr 액세스를 제공하지만 이론적으로는 언제든지 요청을 처리 할 수 ​​있습니다. 대처하고 다시 렌더링 한 다음 EL에서 꺼내십시오. 개인적으로 나는 어떤 종류의 정보를 위해 나중에 사용할 수 있기 때문에 요소를 페이지에 표시하는 것을 선호하지만 이것이 다른 방법입니다. 빈 데이터를 참조하여 숨겨진 요소를 설정하고 다시 렌더링 할 대상이 될 수있는 구성 요소를 래핑하십시오.

checkPageLayoursAreSelected에서 bean에 해당 객체의 값을 설정하고 remoteCommand에서 요소의 구성 요소 래퍼를 렌더링/업데이트하고 After Effects에서 기본 JS 또는 Jquery를 사용하여 값을 가져옵니다. dom.

근무 예 :

view.xhtml

<button type="button" id="buttonClicker" class="buttonClicker" >Click Me</button> 

    <p:remoteCommand name="checkPageLayoutsAreSelected" actionListener="#{testBean.checkPageLayoutsAreSelected}" update="pageLayoutSelected" oncomplete="showVal()"/> 

    <h:panelGroup id="pageLayoutSelected"> 
     <h:inputHidden value="#{testBean.pageLayoutSelected}" id="checkPageLayoutValueId" /> 
    </h:panelGroup> 

    <script> 
    $('.buttonClicker').on('click', function (e) { 
     checkPageLayoutsAreSelected(); 
    }); 
    function showVal() { 
     alert($("[id$='checkPageLayoutValueId']").val()); 
    }; 
    </script> 

TestBean.java

private Boolean pageLayoutSelected; 

    public Boolean checkPageLayoutsAreSelected(ActionEvent event) { 
     if (pageLayoutSelected == null || pageLayoutSelected == Boolean.FALSE) { 
      pageLayoutSelected = Boolean.TRUE; 
     } else { 
      pageLayoutSelected = Boolean.FALSE; 
     } 

    return pageLayoutSelected; 
} 
getters/setters 

나는 데이터 = 수정되었음을 표시하는 경고를 추가했습니다.

중요한 것은 완료되지 않은 단계에서 수행해야합니다. DOM 렌더링이 완료되었음을 절대적으로 확신하기 때문에 JS가 충분히 빠르게 실행되면 DOM에 이전 값이 남아있을 수 있습니다.

희망이 도움이됩니다.

+0

감사합니다. 그러나 다음과 같이하려고했을 때 :'checkPageLayoutsAreSelected();' 'console.log ($ ('# remote \\ : checkPageLayoutValueId') .Val());'항상 이전 값을 얻습니다. 돔은'$ ('remote \\ : checkPageLayoutValueId')와 같이 바뀐다. –

+0

전에 val()'이 실행되어야한다. remotecommand의 'oncomplete/on the oncomplete'이후에 onsuccess 나 pre를 사용할 수 없다. , 또는 물론 실행이 발생한 후에 자바 스크립트를 다시 실행해야합니다. 시간 렌더링에서는 여전히 dom이 있습니다. – VeenarM

관련 문제