2011-10-02 3 views
0

p : p : dataTable 내부의 commandLink ajax 이벤트

<p:dataTable value="#{testBean.dummyStringData}" var="data"> 
    <p:column> 
     <p:commandLink action="#{testBean.printData(data)}"> 
      <h:outputLabel value="#{data}" /> 
     </p:commandLink> 
    </p:column> 
</p:dataTable> 

간단한 백킹 빈 :

 public class TestBean { 

    private List<String> dummyStringData = new ArrayList<String>(); 

    //getters and setters omitted 

    @PostConstruct 
    public void postConstruct() { 
     dummyStringData.add(new String("DummyData1")); 
     dummyStringData.add(new String("DummyData2")); 
     dummyStringData.add(new String("DummyData3")); 
    } 

    public void printData (String data) { 
     System.out.println(data); 
    } 

테이블 내의 링크를 클릭하면 예상 한대로 클릭 된 행의 내용이 stdout으로 인쇄됩니다 .

이제 사용자가 p : commandLink 위로 마우스 커서를 가져 가면 printData 메서드도 호출됩니다. 이를 달성하기 위해 p : ajax 요소를 p : commandLink 요소 안에 중첩 시키려고했습니다.

이 방법은 p에서는 작동하지 않습니다. commandLink p : commandButton 구성 요소. 링크 위로 마우스를 가져 가면 아무 것도하지 않는 것 같습니다. 위의 두 가지 이외의 구성 요소 (예 : p : inputText p : ajax를 위와 같이)를 사용하려면 예상되는 동작을 얻습니다.

x : x : xmx : onmouseover : p : remoteCommand 적절한 ajax 이벤트를 트리거 할 수 있습니다.

<p:commandLink action="#{testBean.printData(data)}" onmouseover="rc()"> 
    <h:outputLabel value="#{data}" /> 
</p:commandLink> 
<p:remoteCommand name="rc" action="#{testBean.printData(data)}" /> 

그러나 데이터 변수는 다음과 같이 전달됩니다. printData 메서드에 대한 매개 변수는 이벤트가 트리거 된 행과 관련이 없습니다. 대신 컬렉션의 마지막 요소가 항상 사용됩니다 (이 경우 "DummyData3").

Tomcat 7이 설치된 MyFaces 2.1.3에서 Primefaces 3.0.M3을 사용하고 있습니다.

건배!

답변

1

There's a solution on the PrimeFaces forum. 또한

...

내가 생성 된 자바 스크립트 함수의 이름이 각 반복에 대해 동일하기 때문에, 마지막 승자라고 생각한다. 각자에게 고유 한 이름을 부여하기 위해 다음과 같이 할 수 있습니다.

<p:dataTable value="#{testBean.dummyStringData}" var="data" rowIndexVar="rowIndex"> 
    <p:column> 
     <p:commandLink action="#{testBean.printData(data)}" onmouseover="rc_#{rowIndex}()"> 
      <h:outputLabel value="#{data}" /> 
     </p:commandLink> 
     <p:remoteCommand name="rc_#{rowIndex}" action="#{testBean.printData(data)}" /> 
    </p:column> 
</p:dataTable> 
+0

감사합니다. 작동합니다. 약간의 관련 문제 - **

** 및 **

*을 사용하여 ** ** 중첩 기능이 작동하지 않습니다 (또는 적어도 작동하지 못할 수도 있음). * 구성 요소? –

+0

아마 AJAX가 내장되어있을 것입니다. 후드 아래에서 벌어지고있는 일은 이미'p : ajax' 컴포넌트가 포함되어 있다는 것입니다. 나는 그것을 시도하지 않았지만 아마도'ajax = "false"'를 설정하면'p : ajax'를 명시 적으로 포함시킬 수 있습니다. 내가 틀렸을 수도있다. 흠, 당신도 잘못 될 수 있습니다.'p : ajax'는이 컴포넌트들에서 작동하지 않습니다. 왜냐하면 내가 직접 시도해 보았다고 말할 수 없기 때문입니다. –

관련 문제