2017-11-30 7 views
0

私はc:setui:paramを試しましたが、最終的には間違ったことをしました。ここで変数をJSFに格納する方法/ c:setとui:paramの問題

は重要なXHTMLの一部です:

<h:form id="formTable"> 
    <p:dataTable editable="true" value="#{types.dataList}" var="datalist" style="width:90%; margin-bottom:20px" 
     rows="10" paginator="true" rowsPerPageTemplate="10,25" resizableColumns="true" liveResize="true" tableStyle="width:auto"> 
     <!-- save the old value for the edit action--> 
     <c:set var="oldValue" value="#{datalist.getType()}"/> 
     <!-- column for testing purpose--> 
     <p:column> 
      <h:outputText value="#{oldValue}" /> 
     </p:column> 
     <p:column headerText="Type" sortBy="#{datalist.type}"> 
      <p:cellEditor> 
       <f:facet name="output"> 
        <h:outputText value="#{datalist.type}" /> 
       </f:facet> 
       <f:facet name="input"> 
        <h:inputText value="#{datalist.type}" binding="#{inputUpdateType}" required="true" /> 
       </f:facet> 
      </p:cellEditor> 
     </p:column> 
     <p:column headerText="Date" sortBy="#{datalist.lastModifyDate}"> 
      <h:outputText value="#{datalist.lastModifyDate}"/> 
     </p:column> 
     <p:column headerText="Edit"> 
      <p:rowEditor rendered="#{!datalist.dependenciesFound}"/> 
      <h:graphicImage value="../images/attention.png" rendered="#{datalist.dependenciesFound}" /> 
     </p:column> 
     <p:column headerText="Delete"> 
      <p:commandLink action="#{types.delete(datalist.type)}" rendered="#{!datalist.dependenciesFound}" update=":formTable"> 
       <p:graphicImage url="../images/delete.png" /> 
       <p:confirm header="Confirmation" message="Are you sure?" icon="ui-icon-alert" /> 
      </p:commandLink> 
      <h:outputText value="Not editable because of dependency" rendered="#{datalist.dependenciesFound}"/> 
     </p:column> 
     <!-- We edit/update the value here. This is where the old value is needed--> 
     <p:ajax event="rowEdit" listener="#{types.update(oldValue, inputUpdateType.value)}"/> 
    </p:dataTable> 
    <p:confirmDialog global="true" showEffect="fade" hideEffect="fade"> 
     <p:commandButton value="Yes" type="button" styleClass="ui-confirmdialog-yes" icon="ui-icon-check" /> 
     <p:commandButton value="No" type="button" styleClass="ui-confirmdialog-no" icon="ui-icon-close" /> 
    </p:confirmDialog> 
</h:form> 

私は、これはやや理解を願っています。 私のプロジェクトではPrimefaces 6.1を使用しています。このテーブルの行を編集するには、古い値を保存し、その値を下のajax呼び出しで使用する必要があります。私はこれが必要です。なぜなら、このアプリケーションの背後にDBテーブルが必要です(IDはこの値です)。 編集した値は変数inputUpdateTypeに格納されます。

私の問題:私は、新しい値を入力して、[編集]を押すと

は、古い値は、アプリケーションがupdateメソッドに入ったときに、編集した値と同じです。どの値が渡されたかを確認するために、更新メソッドでログエントリを作成しました。 c:setui:paramと同じです。

私は間違っていますか?どうすればこの作品を作れますか?

編集:ここでは は私が豆に保存された古い値を取得しようとする方法である:

<p:ajax event="rowEdit" listener="#{types.update(types.dataListOld.toArray()[rowIndex].getType(), inputUpdateType.value)}"/> 
+0

https://stackoverflow.com/questions/3342984/jstl-in-jsf2-facelets-makes-senseから始めてください。 iteratimg h/ui/pコンポーネントでは、jstl 'c:set'を介してvarを割り当てることはできません。 Thw jstlはそれらの前に処理されます – Kukeltje

+0

私がそこで読むことができるので、試したようにすることはできません。別の方法がありますか?エンティティBeanを編集して古い値を保存できるようになりましたが、動作しますが、私はこの解決策が嫌いです。 – kinglite

+0

コントローラに古いエンティティのインスタンスを保存して比較しますか?なぜ、この値をUIレイヤーからコントロール/サービスレイヤーに渡す必要がありますか?それはすでに利用可能なサーバー側である必要があります。 – Kukeltje

答えて

0

だから、値がメソッドを実行する前に更新されますAJAXと思われます。したがって、サーバー側では古い値は使用できなくなります。残念ながら、JSFに変数を格納することもできません。なぜなら、c:setはJSFタグの前で処理され、したがって値を保持しないからです(スコープなしでエイリアスとして動作し、最後にメソッドが実行される前に更新されます)。

私はセル編集モード代わりのデフォルト行編集モードを使用し、この全体のことを動作させるために。これで私は、古いものと新しい値を取得することができるよ:ここ

public void onCellEdit(CellEditEvent event){ 
    //We will call this method on edits made to a cell 
    //Values are stored in a Arraylist. Number of entries depend on how many components there are in the edited cell/facet 
    //Here we have two because in "input" there are two components defined (although both are rendered at the same time). 
    @SuppressWarnings("unchecked") 
    ArrayList<String> oldValue = ((ArrayList<String>)(event.getOldValue())); 
    @SuppressWarnings("unchecked") 
    ArrayList<String> newValue = ((ArrayList<String>)(event.getNewValue())); 

    //In the end both entries have the same value, so we just take the first. 
    if(newValue != null && !newValue.equals(oldValue)) { 
     update(oldValue.get(0), newValue.get(0)); 
     FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Cell Changed", "Old: " + oldValue.get(0) + ", New:" + newValue.get(0)); 
     FacesContext.getCurrentInstance().addMessage(null, msg); 
    }  
} 

を、私は私の値リスト(「入力」の二つの成分)に2つのエントリを持っている理由です。

<f:facet name="input"> 
     <h:inputText value="#{datalist.type}" binding="#{inputUpdateType}" required="true" rendered="#{!datalist.dependenciesFound}"/> 
     <h:outputText value="#{datalist.type}" rendered="#{datalist.dependenciesFound}"/> 
    </f:facet> 
</p:cellEditor> 

関連する問題