2016-07-03 9 views
0

私のjsfデータテーブルコンポーネントで奇妙な動作に直面していて、何が起こっているのか理解できませんでした。これはシナリオです:私は、各行に削除ボタン付きのデータテーブルを持っています。最後の行のボタンをクリックすると、正しく削除されます。最後の行の前の行のボタンをクリックすると、行自体も次の行も削除されます。それ以上の行は影響を受けません。JSF:Datatable excecuting remove methodを2回実行

私の環境:Eclipseのネオン+ Tomcatの8 + Primefaces 6.0

私は、Eclipse内からプロジェクトを実行していますよ。

p:dataTableのデータソースは、p:autoCompleteコンポーネントから選択されたデータによって変更されています。

debbugingモードでは、removeメソッドが毎回異なるパラメータで複数回呼び出されていることを確認できました。ベローはコードの一部です。

Ajaxがサーバーメソッドを1回呼び出すと思われるので(ブラウザ開発ツールを見て)、複数の実行がサーバー側で行われているようです。

私は既にLink 1Link 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; 
} 

起こって何ができるかについての手掛かりをありがとう。

ジュリアーノ

答えて

0

herehereを読んだ後、私は、remove pにprocess="@this"を入れてみました:P内のcommandButton:dataTableの。それはトリックを作ったが、私は慎重にどのように知っているわけではない。私は、このことが、p:commandButtonのactionLinstenerのメソッドだけを処理し、ページの他のコンポーネントの他のアクションは無視していることをサーバーに伝えることを理解しました。まあ、この変更が働いているという事実は、問題は私のページの全体的なロジックにあると指摘しています。実際には、私のミスはどこにあるのか分かりませんが、ページがかなり重いので、私のどこかに間違いがあります。

[1]:Clicking p:commandButton causes the value of p:selectOneMenu being set twice
[2]:

<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" 
          process="@this" <!--solution: adding this attribute--> 
          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> 
Understanding process and update attributes of PrimeFaces

page.xhtmlをに変更しました。