私のjsfデータテーブルコンポーネントで奇妙な動作に直面していて、何が起こっているのか理解できませんでした。これはシナリオです:私は、各行に削除ボタン付きのデータテーブルを持っています。最後の行のボタンをクリックすると、正しく削除されます。最後の行の前の行のボタンをクリックすると、行自体も次の行も削除されます。それ以上の行は影響を受けません。JSF:Datatable excecuting remove methodを2回実行
私の環境:Eclipseのネオン+ Tomcatの8 + Primefaces 6.0
私は、Eclipse内からプロジェクトを実行していますよ。
p:dataTableのデータソースは、p:autoCompleteコンポーネントから選択されたデータによって変更されています。
debbugingモードでは、removeメソッドが毎回異なるパラメータで複数回呼び出されていることを確認できました。ベローはコードの一部です。
Ajaxがサーバーメソッドを1回呼び出すと思われるので(ブラウザ開発ツールを見て)、複数の実行がサーバー側で行われているようです。
私は既にLink 1とLink 2のようなリンクで同様の問題についてGoogle検索しました。
page.xhtml:
<p:autoComplete id="ddl" dropdown="false"
value="#{bean.chosenItem}" var="item"
itemLabel="#{item.name}" itemValue="#{item}"
converter="convertItem"
emptyMessage="No item found" queryDelay="1000"
minQueryLength="3" autocomplete="off"
completeMethod="#{bean.findItemsCompleteText}"
forceSelection="true" placeholder="Type item name"
cache="true" widgetVar="dllWGV">
<p:ajax event="itemSelect"
listener="#{bean.addToDataTable}"
update="dtb ddl" />
</p:autoComplete>
<p:dataTable id="dtb"
value="#{bean.chosenItems}" var="rowItem"
sortBy="#{rowItem.name}" scrollable="true" scrollHeight="90"
scrollWidth="337" tableStyle="#{bean.dtbStyle}"
widgetVar="dtbWGV">
<p:column style="border: none; padding-left: 2px;">
<p:commandButton actionListener="#{bean.removeFromDataTable(rowItem)}"
update="dtb"
style="margin-right: 2px;" icon="fa fa-trash" />
<h:outputText value="#{rowItem.name}" />
</p:column>
<p:column style="border: none; width: 28%;">
<p:spinner suffix="%" min="0" max="100" stepFactor="0.25"
value="#{rowItem.dAux}" size="5" />
</p:column>
</p:dataTable>
管理対象Bean (ViewScoped):
private ItemClass chosenItem;
private List<ItemClass> chosenItems;
private String dtbStyle;
//getters and setters with no logic inside
//beyond getting and setting the properties
@PostConstruct
public void init(){
if (chosenItems == null) {
chosenItems = new ArrayList<ItemClass>();
}
setDtbStyle("visibility: hidden; width: 320px;");
}
//each time, during the multiple executions,
//the parameter localItem has a different value
public void removeFromDataTable(ItemClass localItem) {
this.chosenItems.remove(localItem);
if(chosenItems.size() == 0) {
setDtbStyle("visibility: hidden; width: 320px;");
}
}
public void addToDataTable(SelectEvent event) {
this.chosenItems.add(this.chosenItem);
setDtbStyle("visibility: visible; width: 320px;");
this.chosenItem = null;
}
起こって何ができるかについての手掛かりをありがとう。
ジュリアーノ