2013-03-06 1 views
14

私はページに2つのp:dataTableを持っています。左側は主に選択に使用されますJSF pの奇妙な動作:dataTable(p:columnsの最初のエントリが間違っています)

<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を実装しました。このコンポーネントもselectionselectの属性を持ち、一般的には作品です。 p:dataTableのような同じメソッドが呼び出され、正しいアイテムも設定されます。

しかし、これは本当に厄介なものです:私は私のカスタムコンポーネントを使用する場合は、最初のセル(列0、行0)で常に値はnullです。値はMap<Long,Map<Long,String>>から取得され、メソッドが呼び出された後に特定のrow.id,col.idの値が設定されていることを確認しました。

私はこの問題で完全に断頭しています。この質問に答えるのは本当に難しいと思っており、誰かが私に助けてくれるかどうか本当に感謝しています。この問題をより詳しく説明してください。

Upate 1: 要求することによって、私は#{row.id},#{col.id}チェック:最初のセルで

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

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> 

そして、これは、バッキングBeanです:

@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 = "#{item.value}"とするなど、モデルbeanのいくつかの一意のプロパティに 'rowKey'を指定する必要があります。これを試して、何が起こっているかを見てください。 – partlov

+0

選択可能な 'dataTable'では問題はありません。私は自分のcomposite:コンポーネントを使用しています。使用されたid(long)は一意です。 – Thor

+1

'h:outputText'の近くに'#{row.id}、#{col.id} 'の印字を追加して、期待どおりの値を参照してください。 – partlov

答えて

0

  • UIのような通常のものを試した後:繰り返しc:forEach
  • 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> 
関連する問題