2013-02-19 2 views
10

JSF 2.0, 인 Mojarra 2.0.1, PrimeFaces이 비슷한 질문을하지만 내가 STH 필요자바 스크립트

3.4.1로 백업 빈 값을 얻기. 그밖에; javascript 함수는 js 함수에서 가져 오려고하는 변수를 채우는 backing bean 메소드를 기다려야합니다. 제가 말하고자하는 것은 다음과 같습니다 :

<p:commandLink action="#{statusBean.getStatuses}" oncomplete="afterLoad()"/> 

js 함수는 단지 값을 가져 와서 화면에 출력한다고 가정합니다. 우리가 3

을보고 기대하는 동안

@ManagedBean 
@ViewScoped 
public class StatusBean { 
    public int size=0; 
    List<Status> panelList = new ArrayList<Status>(); 
    public void getStatuses() { 
     this.panelList = fillList(); 
     this.size = panelList.size(); //Assuming 3 
    } 
    //getter and setters 
} 

그래서 함수가의 초기 값은 0과 크기, 경고 : 여기

function afterLoad() {  
    alert("#{statusBean.size}"); 
} 

그리고

은 생일 아이입니다 작동 방식 :
@PostConstruct 주석을 bean의 머리에 추가하면, 페이지가로드되기 전에 bean이 이미 생성되었으므로 확실하게 올바른 크기를 얻습니다. 그러나 이는 중복 프로세스를 의미하며 commandlink 작업 후에 필요한 값입니다. 그래서 js 함수를 연기하는 방법? 어떤 아이디어?

+1

인 Mojarra 2.0.1 고대이다. 벌써 3 년이 넘었습니다. 업그레이드를 고려하십시오. 현재 2.1.19 버전에는 많은 버그 수정 및 개선 사항이 있습니다. – BalusC

+0

@BalusC 확인 버전 차이점을 검토 할 예정입니다. 또한 두 답변이 모두 정확하고 잘 작동하며 partlov에 감사하지만 어느 답변을 선택해야할지 결정할 수 없습니다. 선착순으로 선택해야합니까? 그러나 서버는 당신이 1 분 전에 대답했다고 말합니다. 그러나 제가 마지막으로 보았을 때 파트 로브가 먼저 대답했다고 말했습니다. 같은 시간인가요? –

+0

당신에게 가장 도움이되는 것을 선택하십시오.지금까지 게시 된 답변은 정확히 동일한 정보를 제공하지 않습니다. 정확한 답변 타임 스탭에 관해서는, "대답 된"타임 스탬프의 툴팁을 확인하십시오. 그러나 당신은 대답을 선택하는데 이것을 고려해서는 안됩니다. 이것은 FGITW 만 시뮬레이트합니다. – BalusC

답변

17

JSF/EL과 HTML/JS가 동기화되어 실행되지 않습니다. 대신, JSF/EL은 웹 서버에서 실행되고 차례로 웹 브라우저에서 실행되는 HTML/JS를 생성합니다. 브라우저에서 페이지 열기, 오른쪽 클릭 및 소스보기. JSF/EL은 한 줄 밖에 없습니다. 그것은 하나의 HTML/JS입니다. JS 함수 대신에 다음과 같이 표시됩니다.

function afterLoad() {  
    alert("0"); 
} 

정확히이 JS 함수는 명령 단추 조치가 완료 될 때 호출됩니다. 따라서 그 결과는 충분히 기대됩니다.

기본적으로 JSF가 JS를 다시 렌더링하도록하고 싶습니다.

<p:commandLink action="#{statusBean.getStatuses}" update="afterLoad" oncomplete="afterLoad()"/> 
<h:panelGroup id="afterLoad"> 
    <h:outputScript> 
     function afterLoad() {  
      alert("#{statusBean.size}"); 
     } 
    </h:outputScript> 
</h:panelGroup> 

구체적인 기능 요구 사항에 따라 아무 것도 말하지 않은 경우보다 세련된 방법이있을 수 있습니다. 예를 들어 RequestContext#execute(), <o:onloadScript>

+0

BalusC, you 're rock :) – Anatoly

+2

이것은 오래된 스레드입니다.하지만 질문이 있습니다. 어떻게하면 외부 자바 스크립트 파일을 사용하고 있습니까? 제발 도와주세요. – hermit

8

EL이 페이지가 렌더링 될 때 계산되고 컨테이너를 업데이트 할 수 있습니다 (일부 JSF 구성 요소에있는 경우). 그러나 다른 접근 방법을 제안합니다.

AJAX 요청을 할 때 getStatuses() 메서드에 콜백 매개 변수를 추가 할 수 있습니다. 당신은이에 대한 Primefaces의 RequestContext 유틸리티 메소드 addCallBackParam()를 사용할 수 있습니다

public void getStatuses() { 
    this.panelList = fillList(); 
    this.size = panelList.size(); 
    RequestContext.getCurrentInstance().addCallBackParam("size", this.size); 
} 

당신은 XHTML이 매개 변수를 사용할 수 있습니다

<p:commandLink action="#{statusBean.getStatuses}" oncomplete="afterLoad(xhr, status, args)"/> 

<script type="text/javascript"> 
    function afterLoad(xhr, status, args) {  
    alert(args.size); 
    } 
</script> 
+0

이 위대한 답변 주셔서 감사합니다, 당신은 내게 많은 도움이 오늘 내 친구! –

+0

당신은 오신 것을 환영합니다. – partlov

+0

안녕하세요, 저는'addCallBackParam'에 관한 문제가 있습니다. 처음 호출시'afterLoad (xhr, status, args) '를 사용할 때 완벽하게 작동합니다. 하지만 같은 getStatuses()를 사용하여 두 번째로 호출하고자한다면 afterLoad 메서드에서'size'가'undefined'가됩니다. 두 번째 호출에서 콜백 매개 변수를 올바르게 추가 할 수 없습니다. 두 번째 호출은 사용자가 상태를 추가하고 그 후에 afterLoad가 성공적으로 작동하지만 사용자가 상태를 삭제하면'statusBean.getStatuses'를 호출하는'remotecommand'를 정의하고'oncomplete = " afterLoad (xhr, status, args)'입니다. –

관련 문제