JSF backing bean 메소드에서 JSF 컴포넌트를 업데이트 할 수 있습니까?


100

JSF Backing bean이 페이지의 구성 요소를 업데이트하도록하는 방법이 있습니까? 업데이트 속성이있는 ajax 구성 요소를 사용하여 페이지의 구성 요소를 업데이트하려는 것이 아닙니다. JSF 백업 빈 메서드 내에서 업데이트를 트리거해야합니다. 페이지의 업데이트는이 메서드가 완료된 후 또는 완료되기 전에 발생할 수 있습니다. PrimeFaces를 사용하여 얻을 수있는 솔루션이있는 경우 PrimeFaces를 사용하고 있습니다.


유효성 검사 오류를 트리거 할 수 있음 : stackoverflow.com/a/14401741/1599699
Andrew

답변:


183

표준 JSF API를 사용하여 클라이언트 ID를 PartialViewContext#getRenderIds().

FacesContext.getCurrentInstance().getPartialViewContext().getRenderIds().add("foo:bar");

PrimeFaces 특정 API를 사용하여 PrimeFaces.Ajax#update().

PrimeFaces.current().ajax().update("foo:bar");

또는 아직 PrimeFaces 6.2 이상을 사용하지 않는 경우 RequestContext#update().

RequestContext.getCurrentInstance().update("foo:bar");

JSF 유틸리티 라이브러리 OmniFaces 를 사용하는 경우 Ajax#update().

Ajax.update("foo:bar");

방법에 관계없이 이러한 클라이언트 ID는 뷰 측에서 수행하는 것처럼 구분 문자가 접두사로 붙지 않은 절대 클라이언트 ID를 나타내야 NamingContainer합니다.


6
렌더 응답 단계 (안타깝게도이 코드를 배치해야하는 곳) 동안이 작업을 수행 할 수없는 것처럼 보입니다. Invoke Application 또는 이전 단계에 배치하면 제대로 작동합니다. 응답 렌더링 단계에있는 해결 방법이 있습니까?
BestPractices 2012

8
아니, 너무 늦었 어. 작업 단계를 호출하거나 응답 단계를 렌더링하기 전에 작업을 이동합니다. <f:ajax listener>또는에 의해 메소드 호출<f:event type="preRenderView" listener>
BalusC

JSF 1.2로이를 수행하는 방법에 대한 아이디어가 있습니까? 답변이 너무 길거나 복잡하면 새로운 질문을 할 수 있습니다.
RinaldoPJr

@RinaldoPJr : JSF 1.2에는 <f:ajax>. 이것은 JSF 2.0부터 도입되었습니다. JSF 1.2 구성 요소 라이브러리 특정 기능에 의지해야합니다.
BalusC 2012

@ 다니엘 K : 모르겠어요. 나는 트리니다드를하지 않습니다. 여전히 Trinidad 방식을 이해할 수 없다면 표준 JSF API 접근 방식을 사용하십시오.
BalusC 2015-06-17

9

또한 jsf 지원 빈 / 클래스에서 구성 요소를 업데이트하려고했습니다.

UI 구성 요소를 조작 한 후 다음을 수행해야합니다.

FacesContext.getCurrentInstance().getPartialViewContext().getRenderIds().add(componentToBeRerendered.getClientId())

(서버 측) componentId 대신 clientId를 사용하는 것이 중요합니다 !!


7

RequestContext되어 사용되지 에서 Primefaces 6.2 . 이 버전에서 다음을 사용하십시오.

if (componentID != null && PrimeFaces.current().isAjaxRequest()) {
    PrimeFaces.current().ajax().update(componentID);
}

그리고 backbean에서 자바 스크립트 를 실행 하려면 다음과 같이 사용하십시오.

PrimeFaces.current().executeScript(jsCommand);

참고:


1

조사 할 시간이 충분해야 모든 것이 가능합니다. :)

내가해야 할 일은 입력에있는 ui : repeat 및 표시 이름 및 기타 필드를 반복하는 사람들을 갖는 것과 같습니다. 그러나 필드 중 하나는 singleSelect-A이고 값에 따라 다른 입력을 업데이트합니다-B. ui : repeat조차 내가 넣은 id가 없으며 DOM 트리에 나타납니다.

<ui:repeat id="peopleRepeat"
value="#{myBean.people}"
var="person" varStatus="status">

html의 id는 다음과 같습니다.

myForm:peopleRepeat:0:personType
myForm:peopleRepeat:1:personType

보기에서보다 다음과 같은 방법이 있습니다.

<p:ajax event="change"
listener="#{myBean.onPersonTypeChange(person, status.index)}"/>

그리고 그 구현은 다음과 같은 빈에있었습니다.

String componentId = "myForm:peopleRepeat" + idx + "personType";
PrimeFaces.current().ajax().update(componentId);

그래서 이런 식으로 문제없이 빈에서 요소를 업데이트했습니다. PF 버전 6.2

행운과 행복한 코딩 :)


에 ajax 변경 이벤트가있는 personType경우 사람과 인덱스를 모두 ajax 리스너에 전달하는 것은 불필요합니다. 이벤트에서 ID와 값을 모두 가져올 수 있습니다. 그러나 솔루션이 특정 사용 사례에 필요한 것일 수 있지만 완전한 예제가 없기 때문에 ( 최소한의 재현 가능한 예제 풍미로) 말하기가 어렵습니다.
Kukeltje
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.