これがデータテーブルの行展開の誤動作なのか、それとも何か間違っているのかはわかりません。問題の説明については、できるだけ簡単に説明します。
まず、たとえば、車の色を「変更」できる車のリストを使用して、PrimeFaces のショーケースのような DataTable を作成してみてください。それは簡単です!
次に、commandButton を介して設定されrowExpansion
たプロパティの部分的な処理を行うために、それを実装します。ActionListener
そこまでは、すべて問題ありません。最後の行を展開してから、中央の行を展開してから、展開された最初の行をクリックするcommandButton
と、プロパティActionListener
セットが 2 番目の展開された行を指すか、関連することがわかります。私の例では、データテーブルに 3 つの行を入力するだけです。
1 行だけを展開しようとすると、期待どおりの動作が得られます。
拡張プロセスは、以前に処理されたモデルを上書きするか、知識から離れた他の何らかの不正行為のようです。
次のスニペットを参照してください。
<p:dataTable id="carsTable" var="car" value="#{bean.carsSmall}">
<p:ajax event="rowToggle" listener="#{bean.onRowToggle}" />
<p:column style="width:2%">
<p:rowToggler />
</p:column>
<p:column style="width:49%">
<h:outputText value="#{car.model}" />
</p:column>
<p:column style="width:49%">
<h:outputText value="#{car.year}" />
</p:column>
<p:rowExpansion>
<ui:repeat var="color" value="#{bean.availableColors}">
<p:commandButton action="#{bean.chooseColor}" value="#{color.color}">
<f:setPropertyActionListener target="#{bean.selectedColor}" value="#{color}" />
</p:commandButton>
</ui:repeat>
</p:rowExpansion>
</p:dataTable>
豆
@ManagedBean
@SessionScoped
public class Bean implements java.io.Serializable {
private static final long serialVersionUID = 1708652163041196763L;
private List<Car> carsSmall = new ArrayList<Car>();
private final List<Color> availableColors = new ArrayList<Color>();
private Color selectedColor;
public Bean() {
carsSmall.add(new Car("81025d15", "2011"));
carsSmall.add(new Car("44194657", "2012"));
carsSmall.add(new Car("482f2a60", "2013"));
}
public void clear(){
this.availableColors.clear();
}
public void chooseColor(){
System.out.println(this.selectedColor.getColor());
}
public void onRowToggle(ToggleEvent event) {
// This is a dummy logic for this example...
Car car = (Car) event.getData();
this.availableColors.clear();
if (car.getModel().equals("81025d15")) {
this.availableColors.add(new Color("RED"));
this.availableColors.add(new Color("GREEN"));
this.availableColors.add(new Color("BLUE"));
} else if (car.getModel().equals("44194657")) {
this.availableColors.add(new Color("YELLOW"));
this.availableColors.add(new Color("GRAY"));
this.availableColors.add(new Color("BLACK"));
} else if (car.getModel().equals("482f2a60")) {
this.availableColors.add(new Color("ORANGE"));
this.availableColors.add(new Color("BROWN"));
this.availableColors.add(new Color("PINK"));
}
}
// GETTERS and SETTERS...
}
問題の原因を私が使用しているという事実を指摘する人のために<ui:repeat>
、この不正行為はまた、またはのいずれかで通知され<h:dataTable>
ます<p:dataTable>
この例は、bean が not as or に設定されていると機能しませRequestScoped
んViewScoped
。