2013-03-06 4 views
14

मेरे पास एक पृष्ठ दो p:dataTable है। बाएं को मुख्य रूप से चयनजेएसएफ पी का अजीब व्यवहार: डेटाटेबल (पी: कॉलम में पहली प्रविष्टि गलत)

<p:dataTable id="leftTable" var="item" value="#{bean.items}" 
      selection="#{bean.item}" selectionMode="single"> 
    <p:ajax event="rowSelect" update=":rightTable" listener="#{bean.select}"/> 
    <p:column> 
    <h:outputText value="#{item.value}" /> 
    </p:column> 
</p:dataTable> 

यह काफी सरल है और ठीक काम करता है।

<p:dataTable id="rightTable" var="row" value="#{bean.rows}"> 
    <p:columns var="col" value="#{bean.cols}"> 
    <h:outputText value="#{bean.map[row.id][col.id]}"/> 
    </p:columns> 
</p:dataTable> 

खैर, यह भी ठीक काम करता है: rightTable एक अधिक जटिल एक है, यह एक सरल उदाहरण है। अब मैंने बाएंटेबल को प्रतिस्थापित करने के लिए composite component लागू किया है। इस घटक में selection और select विशेषताएँ हैं और सामान्य रूप से भी काम करता है। p:dataTable जैसी ही विधि को बुलाया जाता है और सही आइटम सेट किया गया है।

लेकिन, और यह वास्तव में एक बुरा बात है: अगर मैं अपने कस्टम घटक का उपयोग, हमेशा प्रथम कक्ष में मूल्य (स्तंभ 0, पंक्ति 0) null है। मान Map<Long,Map<Long,String>> से लिया गया है और मैंने सत्यापित किया है कि विशिष्ट row.id,col.id के मान को विधि के नाम के बाद सेट किया गया है।

मैं इस मुद्दे के साथ पूरी तरह से मूर्खतापूर्ण स्टंप हूं और उम्मीद करता हूं कि अगर कोई मुझे डीबग पर अधिक जानकारी देता है तो मुझे कोई भी मदद कर सकता है।

upate 1: प्रथम कक्ष col.id गलत है में

95,626 | 95,528 
96,527 | 96,528 
97,527 | 97,528 

: अनुरोध करके मैं #{row.id},#{col.id} जाँच की। यह 527 होना चाहिए लेकिन वास्तविक 626 है (यह पिछले अनुरोध का मूल्य है)। ऐसा क्यों होता है? मैं सही मूल्य कैसे प्राप्त कर सकता हूं?

अद्यतन 2: यह मेरा घटक है:

<composite:interface componentType="my.MenuDmClick"> 
    <composite:attribute name="actionListener" required="true" 
     method-signature="void listener(javax.faces.event.AjaxBehaviorEvent)"/> 
    <composite:attribute name="selection"/> 
    <composite:attribute name="update/> 
    <composite:attribute name="dm"/> 
</composite:interface> 
<composite:implementation> 
    <ui:repeat var="item" value="#{cc.attrs.dm.wrappedData}"> 
    <li> 
    <p:commandLink actionListener="#{cc.actionListener(item)}" 
        update="#{cc.attrs.update}"> 
     <h:outputText value="#{item.name}"/> 
    </p:commandLink> 
    </li> 
    </ui:repeat> 
</composite:implementation> 

और यह समर्थन सेम है:

@FacesComponent(value="my.MenuDmClick") 
public class MenuDmClick extends UINamingContainer 
{ 
    public void actionListener(Object ejb) 
    { 
    FacesContext context = FacesContext.getCurrentInstance(); 
    ValueExpression mSelection = this.getValueExpression("selection"); 

    if(mSelection!=null){mSelection.setValue(context.getELContext(), ejb);} 
    else{throw new PropertyNotFoundException("'selection' must be a ValueExpression!");} 

    MethodExpression ajaxEventListener = 
     (MethodExpression) getAttributes().get("actionListener"); 
    ajaxEventListener.invoke(context.getELContext(), new Object[] {}); 
    } 
} 
+0

आप अपने मॉडल सेम के कुछ अद्वितीय संपत्ति के लिए चयन 'dataTable' आप प्रदान करना चाहिए' rowKey' का उपयोग करते हैं, उदाहरण के लिए यह किया जा सकता है 'rowKey =" # {item.value} "'। इसके साथ प्रयास करें और देखें कि क्या हो रहा है। – partlov

+0

चुनिंदा 'डेटाटेबल' के साथ मुझे कोई समस्या नहीं है। ऐसा होता है मैं अपने स्वयं के समग्र का उपयोग करता हूं: घटक। प्रयुक्त आईडी (लंबी) अद्वितीय हैं। – Thor

+1

'h {row.id}, # {col.id}' के पास 'h: outputText' के प्रिंट जोड़ें और अपेक्षित मानों को देखें। – partlov

उत्तर

0

तरह

  • ui सामान्य सामान की कोशिश के बाद: दोहराने और सी: के लिए
  • immed iate = true/false

मैं [email protected] पर आया ... और यह एक आकर्षण की तरह काम करता है!

<c:forEach var="item" items="#{cc.attrs.dm.wrappedData}"> 
    <li> 
    <p:commandLink process="@this" 
     actionListener="#{cc.actionListener(item)}" update="#{cc.attrs.update}"> 
     <h:outputText value="#{item.round.name}"/> 
    </p:commandLink> 
    </li> 
</c:forEach> 
संबंधित मुद्दे