[jsr-314-open-mirror] [jsr-314-open] Ajax inside a DataTable
Andy Schwartz
andy.schwartz at oracle.com
Wed May 19 18:40:54 EDT 2010
On 5/19/10 6:02 PM, Martin Marinschek wrote:
> Hi Andy,
>
>
>> Ids specified by <f:ajax> are relative to containing component - in this
>> case, relative to the <h:commandButton>. This makes is easy to specify
>> execute/render ids for components within the same NamingContainer (which is
>> by far the most common case). In the case of iterating components like
>> <h:dataTable> or <ui:repeat>, this means that execute/render ids refer to
>> components within the same row.
>>
>
> Yes, but what Cagatay totally correctly refers to is that the table is
> certainly not in a row - how can the table be in a row of itself? This
> is semantical nonsense.
>
Ugh, yes, of course. For a moment there it slipped my mind that the
UIData component is indeed found as part of the relative id search. I
was thinking that only the stamped components would be considered valid
execute/render targets when a row index is set. But, since we spec'ed
findComponent() semantics for execute/render, the UIData would indeed be
found, and, yes, we should use the correct client id.
> We should never include the row-index in the client-id of the table
> itself. For this, we need to revise the client-id generation
> algorithm.
>
> Without actually having tried it, I think that it is easy to do so, as
> we have a UIComponentBase.getContainerClientId() to create the
> client-id of the children - when this method is called, we append the
> row-index, if getClientId() itself is called, we don´t. Does this
> sound reasonable to you guys?
>
This is exactly what Trinidad's UIXCollection does.
Perhaps one reason why I had a mental block on the UIData being a valid
execute/render target is because I was always hoping that we could
avoid the findComponent() calls altogether and instead just use basic
string manipulation to produce relative ids. (We would use
findComponent() in development mode just to verify that the specified id
was valid.) All of this component tree searching seems expensive,
particularly when stamping out <f:ajax> content repeatedly (eg. in a
data table).
This ties into another related topic that we left unfinished in JSF
2.0... Ideally we shouldn't need to send execute/render ids to the
client at all as:
1. These ids can be expensive to produce (require findComponent() calls)
2. These ids bloat the size of our rendered HTML content.
For 2.1 perhaps we should consider adding a mechanism by which Behaviors
can hook into the lifecycle early enough to allow AjaxBehavior to set up
the execute/render ids on the PartialViewContext after the postback
occurs. This would be more efficient than requiring AjaxBehavior to
aggressively render out the execute/render lists each time it is asked
for a script. (Again, this could be especially important in the
stamping case.)
Andy
> I think we can regard this as an implementation bug - Catagay, can you
> open issues for Mojarra and MyFaces?
>
> best regards,
>
> Martin
>
>
More information about the jsr-314-open-mirror
mailing list