2011-12-15 5 views
1

ajax를 사용하여 항목을 선택할 때 여러 요소를 변경하는 복합 구성 요소가 있습니다. 또한 Primefaces p : ajaxp : commandButtonf : ajax 대신에 사용하면 차이가 있습니다.복합 구성 요소 내에서 업데이트/렌더링 매개 변수는 어떻게 찾습니까?

문제는 전체 구성 요소가 업데이트되도록 구성 요소에 사용할 업데이트 특성을 찾을 수 없다는 것입니다. 예를 들어, 다음 단추 :

<p:commandButton id="slGoUSA" 
     value="USA" 
     rendered="#{cc.USAButtonOn}" 
     actionListener="#{cc.doSetUSA}" 
     update="???" /> 

나는 시도 모두 다음과 그들 중 누구도 작동하지 :

update="#{cc.attrs.update}" 
: 작업을 수행

update="@this" 
update="@form" 
update="#{cc.clientId}" 
update=":#{cc.clientId}" 
update="#{cc.clientId}:localID" 
update=":#{cc.clientId}:localID" 

유일한 있다는 것은 이것이다

그리고 클라이언트 페이지가 복합 구성 요소를 포함하는 일부 clientId를 전달합니다. 그러나 사용자가 구성 요소 호출에 업데이트 매개 변수를 포함하도록하고 싶지는 않습니다. 이 작업을 수행하는 편리한 방법이 있습니까?


업데이트

좋아, 내가 완전한 테스트 케이스를 보여 경우에 도움이 될 것 같아요. 나는이 같은 복합 구성 요소를 백업 할 UINamingContainer을 구현 :

/* 
* Test code 
*/ 
package com.myapp.app.component; 

import java.io.Serializable; 
import javax.faces.component.FacesComponent; 
import javax.faces.component.UINamingContainer; 

@FacesComponent(value="qctest") 
public class Qctest extends UINamingContainer implements Serializable { 

private enum StateKey { Counter } 

public Qctest() { } 

@Override 
public String getFamily() { return "javax.faces.NamingContainer"; } 

public Integer getCounter() { 
    Integer i = (Integer) getStateHelper().get(StateKey.Counter); 
    if (i == null) i = Integer.valueOf(1); 
    else i += 1; 
    getStateHelper().put(StateKey.Counter, i); 
    return i; 
} 
} 

는 그 다음 cc의 정의는 다음과 같습니다

<!-- INTERFACE --> 
<cc:interface componentType="qctest"> 
</cc:interface> 

<!-- IMPLEMENTATION --> 
<cc:implementation> 

    <h:outputText id="outText" value="Counter is now: #{cc.counter}" /> 
    <br/> 
    <p:commandButton value="Hit Me" update=":#{cc.clientId}" /> 
    <br/> 
    <h:commandButton value="Or Hit Me" > 
     <f:ajax render=":#{cc.clientId}"/> 
    </h:commandButton> 

</cc:implementation> 
</html> 

이 코드는 기본적으로 처음 AJAX 페이지 사상 OMG입니다! 일반 백킹 빈이있는 일반 페이지 대신 컴포지트 구성 요소 안에 있다는 점을 제외하고는 응용 프로그램과 다릅니다.

업데이트를 수행하는 데는 두 가지 버튼 모두 성공하지 못합니다. Firebug는 XHR이 보내지는 것을 보여 주지만 응답으로 카운터를 업데이트하지는 않습니다. 또는 에 대한 다른 값은 모두입니다. 이 날 것으로 보인다

malformedXML: During update: test2form:xyz not found 

은 내부 AJAX의 가장 사소한 사용할 수 : 표시된 경우, primefaces 버튼을 말한다 나는 대화 상자를 얻을 JSF 명령 단추의 경우, 아무것도하지 않는 것 같다 컴포지트 구성 요소. 아무도 무슨 일이 일어날 수 설명 할 수 있습니까?

+0

흠, 대신에 을 사용해 보셨습니까? – BalusC

+0

그건 내 목록에있다. 그러나 렌더링 속성에 clinetId 형식을 사용 하시겠습니까? @BalusC – AlanObject

+0

모든 것을

답변

1

malformedXML가 : 업데이트하는 동안 : test2form : XYZ가 네 말이 맞아

를 찾을 수없는, 정확히 ID가 생성 된 HTML DOM 트리에서 아무도 HTML 요소가 없습니다. 복합 컴포넌트의 컨텐츠 자체는 JavaScript에 의해 접근 가능한 일부 일반 HTML 요소로 래핑되지 않습니다. 당신은 기본적으로 일부 컨테이너 구성 요소에서 가져와야 것 :

<cc:implementation> 
    <h:panelGroup id="container"> 
     ... 
     <h:commandButton value="submit"> 
      <f:ajax render="container" /> 
     </h:commandButton> 
     ... 
     <p:commandButton value="submit" update="container" /> 
     ... 
    </h:panelGroup> 
</cc:implementation> 

그러나 @form 당신을 위해 작동하지 않았다 난 아직도 왜 궁금해. 그것은 나를 위해 작동합니다.

+0

나는 이것을 시도했지만 지금은 테스트 케이스에서 다시 시도하고 다시보고 할 것이라고 생각했다. – AlanObject

+0

OK 방금 시도했는데 두 가지 제안이 모두 내 테스트 케이스에서 작동합니다. 내부 컨테이너와 '@form'에 대한 업데이트를 얻을 수 있습니다. 그래서 내가 왜 내 일반적인 응용 프로그램에서 작동하지 않는지 다시 돌아 가야 할 것입니다.하지만 완료되기 전에 읽을 PrimeFaces 자바 스크립트가 있다고 생각합니다. 하나의 특이성 - 비록'@ form'을 사용할 때 "식별자가있는 구성 요소를 찾을 수 없습니다"라는 오류 메시지가 나타납니다. "test2form"in view - test2form은 내 양식의 id 속성 값입니다. – AlanObject

+0

Mojarra 2.1.4와 관련이 있습니까? 그건 그렇고 당신의 재정의 된'getFamily()'메소드는 불필요합니다. 확장 된'UINamingContainer' 클래스는 이미 동일한 구현을 가지고 있습니다. 'NamingContainer' 인터페이스를 구현할 때만 필요합니다. – BalusC

관련 문제