0

これがデータテーブルの行展開の誤動作なのか、それとも何か間違っているのかはわかりません。問題の説明については、できるだけ簡単に説明します。

まず、たとえば、車の色を「変更」できる車のリストを使用して、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 に設定されていると機能しませRequestScopedViewScoped

4

1 に答える 1