2012-04-19 1 views
0

을 읽는하지 내가 가지고 온 클릭에서 질의 한 후 설정된 loggedIn 부울이있는 AdminBean : 나는 다른 자바 스크립트 일을 원하기 때문에JSF의 F : 아약스의 onEvent는 빈 값

<h:commandButton rendered="#{!adminBean.loggedIn}" styleClass="moreButtonAsText" id="adminLoginAsText" value="Login" action="#{adminBean.logIn}"> 
     <f:ajax render="detailsBox adminForm" execute="@form" onevent="onevent"/> 
    </h:commandButton> 

    </h:form> 
</div> 

<script type="text/javascript"> 
    function onevent(e){ 
    if(e.status=='success') { 
     alert(#{adminBean.loggedIn}); 
    } 
    if(e.status=='complete') { 
     alert(#{adminBean.loggedIn}); 
    } 
    } 
</script> 

나는이 필요를 사용자가 성공적으로 로그인했는지 여부를 기반으로합니다. 명령 단추를 처음 클릭하면 (분명히) 로그인 한 다음 true로 설정됩니다. 나는 명시 적으로 내 AdminBean 수업이 있습니다

public boolean isLoggedIn() { 
    System.out.println(loggedIn); 
    return loggedIn; 
} 

원래 내가 모든 onevent="#{adminBean.loggedIn} ? yesFunction : noFunction처럼 중첩의 onEvent를했지만 문제가 해결되지 않았다. 그래서 주위를 읽고 찾았습니다. http://fyhao.com/2010/05/computer-and-it/java/java-server-faces/jsf-2-fajax-why-execute-onevent-three-times/ 그래서 인라인 함수로 나누기로 결정했는데, 여전히 작동하지 않았습니다.
그런 다음 자바 스크립트가 값을 생각하는 것에 대한 명확한 경고문 (그리고 내 인쇄물이 동의하는지 ...)을 제외하고 위에 게시 한 항목으로 이동하기로했습니다.

Java 콘솔 첫 번째 경고 (즉, e.status=='complete')는 처음에는 많은 falses를 인쇄 한 다음 많은 내용을 인쇄합니다.
JavaScript 경고는 false입니다.

다음 콘솔을 지우고 경고에서 확인을 클릭하십시오. 그런 다음 콘솔에서 을 인쇄하지 않고을 인쇄하고 두 번째 경고가 여전히 false로 호출됩니다. 그래서 내 JavaScript가 실패합니다.

이제 다른 하나의 이상한 점은 ... AdminBean이 세션 범위가 있다는 것입니다. 주소 표시 줄에있는 Enter 키를 다시 누르면 JavaScript가 실제로 알릴 것입니다 ... 비록 렌더링이 여전히 제대로 작동하더라도 (자바 스크립트 경고 true에도 불구하고 로그인했을 때만 렌더링해야하는 항목은 표시되지 않음) .

도대체 무슨 일이 벌어지고 있습니까?

자세한 정보/코드가 필요하면 질문하십시오.

편집 # 1 :

나는 또한 onevent="#{adminBean.loggedIn} ? yesFunction : noFunction을 시도 내가 onevent="#{adminBean.loggedIn} ? yesFunction : noFunction, 을 시도 그 위에 말했을 때. 나는 그 함수에 따옴표/아포스트로피가 누락 될 수 있다는 것을 알지만, 그 문제를 해결하기 전에 adminBean.loggedIn 문제를 수정하고 싶습니다.

# 2 편집 :

가 선택한 답변을 참조; 나는이 솔루션을 연구하고 있었고 그 결과 기본적으로 내 결과를 확인했다.

<h:form id="javascriptHack"> 
    <h:form id="hiddenJS" rendered="#{adminBean.loggedIn}" > 
    <script type="text/javascript"> 
     $(function() { 
     (#{adminBean.loggedIn}) ? slowCloseAdminPanel() : adminPanelLeftOpen(); 
     }); 
    </script> 
    </h:form> 
</h:form> 

이것은 해킹 방법 일 수 있지만 작동합니다.

답변

1

이것은 ajax 요청이 스크립트를 업데이트하지 않기 때문입니다. 여전히 초기 값을 유지합니다. 스크립트를 <h:form> 안에 넣을 수 있습니다. 이것은 효과가있다.

+0

원래는 f : ajax에 있던'onevent = "# {adminBean.loggedIn}? first : second"가 있는데, 내부에있는 양식을 다시 렌더링하고 있습니다. 그게 왜 효과가 없을지 모르겠다. 그러나 ... 나는 일하고 있었고 지금은 기본적으로 정확하게 당신이 (당신의 의견을 보았습니다) 무엇인가를 테스트 완료했습니다. 솔루션을 게시하기 위해 코드를 편집합니다. 왜 첫 번째 방법은 효과가 없었습니까? – twmb