私はページに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
を実装しました。このコンポーネントもselection
とselect
の属性を持ち、一般的には作品です。 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[] {});
}
}
選択可能な 'dataTable'を使用するときは、' rowKey = "#{item.value}"とするなど、モデルbeanのいくつかの一意のプロパティに 'rowKey'を指定する必要があります。これを試して、何が起こっているかを見てください。 – partlov
選択可能な 'dataTable'では問題はありません。私は自分のcomposite:コンポーネントを使用しています。使用されたid(long)は一意です。 – Thor
'h:outputText'の近くに'#{row.id}、#{col.id} 'の印字を追加して、期待どおりの値を参照してください。 – partlov