Details
-
Bug
-
Status: Closed
-
Critical
-
Resolution: Fixed
-
1.0.9m9
-
None
-
None
-
WindowsXP, JDK 1.4.1_06, Tomcat 5.5
Description
I'm using a dataTable with sortheader. Everything is fine as long as I
use outputText instead of a inputText. If I use inputText, the
List/array is sorted correct on the srever side when my value binding is invkoked by the datatable, but the old model (unsorted) is displayed.
I debuged that a bit and recognized, that as soon as I click any command button, the sorted list gets displayed correctly. This is because refresh() is called in the datatable when clicking a commandButton. Refresh isn't called when u click on the sort header command. On the other hand using outputText works fine. While looking at the HtmlDataTableHack class i found
private static int restoreDescendantComponentStates(UIComponent component,
EditableValueHolderState[] states,
EditableValueHolderState[] initialStates,
int counter, int level)
{
for (Iterator it=getChildrenAndOptionalFacetsIterator(level, component); it.hasNext()
{
UIComponent child = (UIComponent)it.next();
//clear this descendant's clientId:
child.setId(child.getId()); //HACK: This assumes that setId always clears the cached clientId. Can we be sure?
if (child instanceof EditableValueHolder)
{
if (states != null)
else if (initialStates != null)
{ initialStates[counter].restore((EditableValueHolder)child); }else
{ // No state saved yet and no initial state !? // Should never be possible, but let's reset the component // state to null values ((EditableValueHolder)child).setValue(null); ((EditableValueHolder)child).setLocalValueSet(false); ((EditableValueHolder)child).setValid(true); ((EditableValueHolder)child).setSubmittedValue(null); } counter++;
}
counter = restoreDescendantComponentStates(child, states, initialStates, counter,level+1);
}
return counter;
}
Not sure, but it seems that this codes cuases the old model state to be rendered and not the newly sorted one. If I have time, I will track it down a bit more.
You can simply reproduce this by changing the sortTable example. You
only need to change outputText into inputText.