2013-11-15 57 views
1

問題(精簡版)行上extendedDataTable行不通的渲染

我有RichFaces的(4.3.2決賽)的問題。
我試圖重新排列rich/extendedDataTable中的一行/單元格。我無法讓它工作。 唯一可行的是重新渲染整個表格。

我能找到的所有示例/教程都適用於3.3版本。那些解決方案不爲我工作。

我希望你能幫助我解決方案或4.2 +示例/教程。


問題的長版

extendedDataTable 未選擇行單元格:

<a4j:outputPanel layout="block" rendered="#{inactive}"> 
    <h:outputText 
     value="#{cc.attrs.rowItem.getValue(cc.attrs.id)}" 
     styleClass="outputField" 
     style="#{cc.attrs.style}"> 
    </h:outputText> 
</a4j:outputPanel> 

選擇行單元格:

<a4j:outputPanel layout="block" rendered="#{active and field.echoed}"> 
<h:inputText 
    value="#{field.value}" 
    id="#{cc.attrs.id}ID" 
    disabled="#{field.disabled}" 
    readonly="#{field.readonly}" 
    rendered="true" 
    title="#{field.title}"/> 
    .... 
</a4j:outputPanel> 

在選擇其他行的:

<a4j:ajax event="selectionchange" 
      listener="#{crudBean.actionForm.selectionListener}" 
     render="messages,saveButton,deleteButton,multiOccurenceTable" 
/> 

HTML代碼,未選中的行的小區:

<td class="rf-edt-td-j_idt230"> 
    <div class="rf-edt-c rf-edt-c-j_idt230"> 
    <div class="rf-edt-c-cnt"> 
     <div id="multiOccurenceTable:0:soort:soort"> 
     <div id="multiOccurenceTable:0:soort:j_idt140"> 
      <span class=" outputField" style="">VO</span> 
     </div> 
     </div> 
    </div> 
    </div> 
</td> 

選定行細胞HTML:

<td class="rf-edt-td-j_idt230"> 
    <div class="rf-edt-c rf-edt-c-j_idt230"> 
    <div class="rf-edt-c-cnt"> 
     <div id="multiOccurenceTable:1:soort:soort"> 
     <div id="multiOccurenceTable:1:soort:j_idt240"> 
      <input id="multiOccurenceTable:1:soort:soortID" name="multiOccurenceTable:1:soort:soortID" value="VO" type="text"> 
     </div> 
     </div> 
    </div> 
    </div> 
</td> 

我的嘗試: on selectionchange重新顯示現在放在表上:「multiOccurenceTable」。 這可以工作,在每次選擇更改時,整個表格都會被重新渲染。

對於性能我嘗試更新行或單元格級別的表。我無法得到這個工作。我嘗試了簡單而複雜的解決方案,但都沒有成功。我究竟做錯了什麼? (大多數示例/教程適用於richfaces 3。3,其可能是一個原因因特網)

嘗試1,手動更新的行/細胞上:

所有3行:當我按下「保存」按鈕什麼都沒有發生

<a4j:commandLink actionListener="#{crudBean.actionForm.save}" 
    render="multiOccurenceTable:0,multiOccurenceTable:1,multiOccurenceTable:2" 
    reRender="multiOccurenceTable:0,multiOccurenceTable:1,multiOccurenceTable:2">Save 
</a4j:commandLink> 

一個單元:什麼都沒有發生的時候我按 '保存1' 按鈕

<a4j:commandLink actionListener="#{crudBean.actionForm.save}" 
    render="multiOccurenceTable:@rows(crudBean.actionForm.rowsToUpdate):soort" 
    reRender="multiOccurenceTable:@rows(crudBean.actionForm.rowsToUpdate):soort">Save1 
</a4j:commandLink> 

我也有ajaxKeys採用根據該tutorial rich 3.x沒有更迭,這example (rich 3.3)

試圖如果您有任何可能的解決方案,請讓我知道。


我的錯誤已修復。錯誤不是渲染。但是渲染的條件被設置在渲染的組件之外。這導致重新渲染組件時未更新值,導致屏幕上沒有任何更改。

經驗教訓:如果您有渲染條件,請確保條件值位於重新渲染的組件內。


回答

2

我對richfaces 4不熟悉,知道extendedDatatable的細節。一個快速搜索讓我相信它是而不是可能自動渲染一行,因爲行不是一個組件。

所以你好像被卡住了,不得不渲染單個單元格。

渲染基於組件的clientId而工作。你可以在你的html代碼中找到確切的ID。因爲它在那些clientId上工作,所以你想渲染的組件已經需要被渲染。

換句話說,你需要有一個ID,每個默認渲染面板來包裝你的組件:

<h:outputPanel layout="block" id="soortPanel"> 
    <h:outputText 
     value="#{cc.attrs.rowItem.getValue(cc.attrs.id)}" 
     rendered="#{inactive}"> 
    </h:outputText> 
    <h:inputText 
     value="#{field.value}" 
     rendered="#{active}"/> 
</h:outputPanel> 

的outputpanel應該得到一個編號,如:multiOccurenceTable:1:soortPanel和你應該能夠呈現該ID。

+1

p.s.你需要使用術語渲染。 reRender是來自早期版本a4j的a4j術語。 JSF 2基本上標準化了a4j並將reRender重命名爲渲染。 我認爲reRender這個詞更好,因爲你不能渲染任何未被渲染的東西。 Primefaces具有最佳的術語; 「更新」,但這並沒有真正幫助清除困惑:) –

+0

謝謝。這個錯誤在別的地方,這個答案讓我看着正確的方向。 –

+0

ps。對於未來讀者的更正:應該是。 –