リストを反復処理するデータテーブルがあります。それを myList と呼びましょう。いくつかのリクエスト パラメータに基づいて、この myList にデータを入力します。データテーブル内には commandLinks があります。要求値の適用段階で myList にダミーのエントリを入れると、最初の commandLink をクリックすると、正常に機能します (アプリケーションの呼び出し段階で実行され、それまでに正しいエントリが myList に含まれます)。そうしないと、または 2 つ目以降の commandLink をクリックしても、何も起こりません。したがって、コマンドボタンの clientId は、アプリケーションの呼び出しフェーズでのみ使用されるとはいえ、リクエストの適用フェーズで解決され、commandLinks が壊れていると推測しています。
このようなもの:
<h:selectManyCheckbox styleClass="hidden"
value="#{cc.attrs.selectionList.selected}"
converter="#{cc.attrs.converter}" >
<f:selectItems value="#{cc.attrs.selectionList.all}"
var="item" itemValue="#{item}" itemLabel="" />
</h:selectManyCheckbox>
<h:dataTable value="#{cc.attrs.selectionList.selectedTest}" var="item">
<h:column>
<h:commandLink value="deselect" action="#{cc.attrs.selectionList.deSelect(item)}">
<f:ajax execute=":#{component.parent.parent.parent.clientId}"
render=":#{component.parent.parent.parent.clientId}" />
</h:commandLink>
</h:column>
</h:dataTable>
そしてモデル:
public List<E> getSelected()
{
return myList;
}
public List<E> getSelectedTest()
{
if(FacesContext.getCurrentInstance().getCurrentPhaseId().equals(PhaseId.RESTORE_VIEW) && getSelectedList().isEmpty())
{
return Collections.singletonList(myList.get(0));
}
else if(FacesContext.getCurrentInstance().getCurrentPhaseId().equals(PhaseId.APPLY_REQUEST_VALUES) && getSelectedList().isEmpty())
{
return Collections.nCopies(2, myList.get(0));
}
else if(FacesContext.getCurrentInstance().getCurrentPhaseId().equals(PhaseId.PROCESS_VALIDATIONS) && getSelectedList().isEmpty())
{
return Collections.nCopies(3, myList.get(0));
}
else if(FacesContext.getCurrentInstance().getCurrentPhaseId().equals(PhaseId.UPDATE_MODEL_VALUES) && getSelectedList().isEmpty())
{
return Collections.nCopies(4, myList.get(0));
}
return myList;
}
public void deSelect(E item)
{
myList.remove(item);
}
この例では、データテーブルの上位 2 つの commandLinks が機能します。私の質問は、なぜこの動作なのかということです.myListをダミーエントリで埋めずに回避する方法はありますか? データを保存するために (viewscoped) バッキング Bean を使用したくありません。