[jsr-314-open] Ajax rendering of components among compositions?
Andy Schwartz
andy.schwartz at ORACLE.COM
Mon May 25 08:16:29 EDT 2009
I logged the following spec issue to request that we clarify the
execute/render id behavior:
https://javaserverfaces-spec-public.dev.java.net/issues/show_bug.cgi?id=567
This is easy enough to fix, and since this is already a source of
confusion, we should definitely fix this in the next spec draft.
Andy
Andy Schwartz wrote On 5/25/2009 8:06 AM ET:
> Gang -
>
> There is one obviously critical piece of information missing here that
> clearly needs to be described more explicitly within the spec/pdldocs.
> The format for the execute/render ids in the f:ajax tag matches the
> format for ids that are passed to findComponent(). That is... ids that
> do not start with the naming container separator character are treated
> as relative to the current naming container. Ids that do start with
> the separator character are treated as absolute ids - ie. are resolved
> relative to the UIViewRoot.
>
> So, for example, let's say we have the following component tree where
> we use f:subview to introduce a naming contianer
>
> <f:view>
> <f:subview id="namingContainer">
> <h:commandButton id="insideButton"/>
> <h:graphicImage id="insideImage"/>
> </f:subview>
>
> <h:graphicImage id="outsideImage"/>
>
> </f:view>
>
> If we want to Ajax-enable the "insideButton" to target the
> "insideImage, we would use the following f:ajax tag:
>
> <f:ajax render="insideImage"/>
>
> If, on the other hand, we want to target the "outerImage", which is
> outside of the naming container, then we must use an "absolute id", eg:
>
> <f:ajax render=":outsideImage"/>
>
> (Note the leading ":" character.) This is similar to calling
> insideButtonComponent.findComponent(":outsideImage") - ie. this will
> start the search for the "outsideImage" id up at the root naming
> container.
>
> The fact that the pdldocs do not describe the format for
> execute/render ids is clearly a spec bug that needs to be addressed. I
> will open a bug to track this in a moment. This behavior is defined in
> the actual spec document itself in section 10.4.1.1 under the title
> 'Specifying “execute”/”render” Identifiers'. But even that section
> could use some clarification (eg. could use an example like the one
> above to illustrate the behavior).
>
>
> David Geary wrote On 5/24/2009 11:39 PM ET:
>> Notice the <f:ajax> tag. I think I'm accessing the image from the
>> parent component (map.xhtml) correctly. However, when I load the page
>> I get this:
>>
>> <f:ajax> contains an unknown id
>> 'form:j_id1186681689_16ef8569:0:j_id1186681689_16ef8513:j_id-1105909415_41ead6fe:image'
>>
>
> If I had to guess (haven't looked at the implementation yet), the
> issue is that we are searching for this id relative to the composite
> component's naming container. Since this particular id is not present
> under the composite component, we do not find the target component. We
> should make this error message more explicit - ie. we should include
> the id of the naming container within which we searched for the id.
>
>>
>> If I remove the f:ajax tag, load the page, and check the source, I
>> see an <img> tag:
>>
>> <img
>> id="form:j_id1186681689_16ef8569:0:j_id1186681689_16ef8513:j_id-1105909415_41ead6fe:image"
>> src="..."/>
>>
>> And that id is *exactly* what <f:ajax> says it cannot find. It's in
>> the page, but <f:ajax> cannot find it?!?
>>
>> My guess is that <f:ajax> is evaluating the id before the page is
>> completely constructed, and therefore, it doesn't find it, but that's
>> just a WAG on my part.
>
> You'll need to use the ":" prefix within your render id to indicate
> that you are specifying an absolute id. If that does not work, then my
> guess is that there is an implementation bug here.
>
> Andy
>
>
>
More information about the jsr-314-open-mirror
mailing list